沈圣

来自CGTWiki
跳转至:导航搜索
沈圣.jpg

个人简历:

生于1997年2月17日,籍贯山东菏泽。

2015级  山东理工大学  计算机科学与技术学院      软件工程  本科生
2019级  北京邮电大学  信息光子学与光通信研究院  光学工程  硕士研究生

四级:437
主要研究方向为三维显示和计算机图形学。

Tel: 19800308001
Email: shensheng@bupt.edu.cn

电脑配置:

操作系统 Windows 10 专业版 64位	

处理器	 英特尔 Core i9-9900K @ 3.60GHz 八核

主板	 技嘉 Z390 AORUS ULTRA-CF

内存	 32 GB ( 金士顿 DDR4 3200MHz )

主硬盘	 三星 MZVLB256HAHQ-00000 ( 256 GB / 固态硬盘 )

显卡	 Nvidia GeForce RTX 2080 ( 8 GB / 技嘉 )

显示器	 飞利浦 PHL0902 PHL 272P7V ( 27.2 英寸  )

周报

2021.04.09号周报

  • 1、使用Cesium for Unreal插件
  • 2、测试上传模型

2021.01.25号周报

  • 1、增加光场程序修改、保存参数的功能,并上传git
  • 2、迁移光场小飞机项目

2021.01.11号周报

  • 1、编写空间人项目二期词条
  • 2、将多机同步的光场集群渲染项目添加播放模型动画插件,实现同步播放、暂停模型动画的功能。
  • 3、增加假期学习词条,每天记录学习笔记。

8.30号周报

  • 1、将水下场景集成到716项目中。

8.22号周报

  • 1、在测试用例中实现了在c++端利用结构体储存多个指针然后返回给c#端进行保存,但还未着手在平台进行修改整理。
  • 2、写了一个水下场景,实现了水底上浮气泡,潜艇发射鱼雷,鱼雷碰撞目标爆炸。
  • 3、利用EasyTouch插件实现了简单的第三人称校园漫游,插件已上传ftp供大家使用。

8.16号周报

  • 1、撰写小场景的软件著作权
  • 2、写了一个安卓端手动操作漫游的demo

2.21号周报

  • 1、本周将侯捷的c++视频过了一遍;看了几节图形学的课
  • 2、了解了pinvoke机制和clr机制(简单来说就是在C#中调用C++代码的两种方式),写了两个小例子试验了一下,下一步准备着手修改平台代码
  • 3、翻译并看了第一篇论文“局部光场融合:与规定的采样指南的实际视图综合”的introduction和related work(没。。没太看懂)

3.1号周报

  • 1、学习C++/CLR。
  • 2、修改平台代码,首先需要在C++项目设置里面设置,让动态库受到公共语言运行时的支持。在C++项目头文件声明class的时候,在前面添加public ref关键字。然后生成DLL,并在C#项目中添加C++项目引用。本来想从添加标注这个函数开始修改,但修改后发现报错很多,正在逐步修改。
  • 3、继续看了图形学的视频。

3.6号周报

  • 1、将一部分功能修改为clr模式,平台运行良好。
  • 2、测试了添加视频和添加路径功能,添加视频没有问题,添加路径时获取不到经纬度坐标,研究后发现是因为修改后的代码在设置经纬度坐标时传递的是值,只在函数内发生了改变,并没有返回到函数外部,经过查询如何将C++的数据的引用传递给C#,将此问题解决。
  • 3、继续看了clr的书籍,以及图形学的视频。

3.15号周报

  • 1、继续将一部分代码改为clr模式。
  • 2、学习了一下关于投影纹理方面的知识,为将投影纹理功能集成到平台做准备。
  • 3、由于这两天家里的网实在不好,所以看了看下载的OSG的《最长的一帧》。

3.20号周报

  • 1、打算改进视频功能,以实现能够在一个模型加载任意多个视频,通过和张泷交流发现由于没有将添加模型图层、添加视频模型的功能改为clr模式,模型图层、视频模型不能添加,因此将其修改为clr模式,期间通过查询资料,解决了C# 调用C++ CLR dll类库时,string 到 sbyte* 的转换。经测试,可以正常添加模型和视频。但手动修改视频的平移、缩放、旋转时会出现错误,正在修改中。
  • 2、目前添加视频时只能选择一个视频,经修改后可以选择多个视频,具体前台添加多个视频的窗口如何设计需要和师兄商量后继续进行。
  • 3、继续学习osg相关知识。

3.28号周报

  • 1、手动修改视频的平移、缩放、旋转时会报读取或写入受保护内存。怀疑大概率是传指针参数的问题。暂时没有找到解决办法。。。
  • 2、看了看osg关于相机方面的知识,又去翻了翻OpenGL着色器的内容看了看,画了一个平行四边形。。。

4.6号周报

  • 1、看完了LearnOpenGL的入门篇,了解了着色器、纹理、摄像机的工作原理,以及如何用矩阵变换物体在不同坐标系下的位置。详细内容贴在了上面OpenGL标签下。
  • 2、学习了精通.NET互操作,前三章介绍了P/Invoke的调用模式,所以就跳过去了,直接看了第四章C++ Interop,感觉和clr模式比较相像。看过以后发现以前改的方法好像有些笨。其实可以使用C++ Interop创建一个针对非托管类的包装类,在包装类里面实现数据的封装传送,只要在包装类的定义中,使用一个指向非托管类的指针作为私有变量,在包装类的构造函数中将非托管类实例化并赋给该成员变量就行了。这样的话就不用对非托管代码进行改动了(其实这样的话感觉继续使用OSGHANDLE里的代码好像也可以)。但是目前的情况是已经对非托管代码(也就是C++的代码)改动好多了,并且数据的转换封送写在了各个文件中,想要改回来需要花费一定时间。目前正在写一个demo测试上述想法。详细内容贴在了上面C++ Interop标签下。

4.12号周报

  • 1、继续学习精通.NET互操作第四章,在OSGCLR类里面添加了一个将C#的string字符串转换为char*类型并返回的函数,经测试可以使用。使用方式:oSGCLR.PassString(需要转化的字符串),代码已上传。
  • 2、继续学习了OpenGL关于光照的部分。详细内容贴在了上面光照标签下。

4.19号周报

  • 1、翻译并阅读了一篇论文《Multi-view Relighting using a Geometry-Aware Network》
  • 2、移除了OSGHANDLE。

4.26号周报

  • 1、将平台改为clr模式,在C#中设置了一个编译开关#define OSGCLR,如果想切换为clr模式,只需要把#define OSGCLR的注释打开,或者在每个C#项目的属性中的生成选项中的条件编译符号输入OSGCLR也行。代码已上传。
CLR
CLR1
  • 2、调研《Multi-view Relighting using a Geometry-Aware Network》有关的扩展知识和背景知识。

5.1号周报

  • 1、在网上寻找到好用的标图工具,如dlib的imglab工具,或者LabelImg工具,LabelImg工具在网上找到了打包好的可执行文件,但是好像只能标框不能标点,所以打算改用dlib下的imglab工具,但这个需要自己编译,目前正在编译中。使用方法还是比较简单的。详情可见Dlib训练

5.23号周报

  • 1、学习了如何在windows进程间传递消息,实现了两个wpf窗口传递消息。
  • 2、上传了多机同步项目的代码。

6.11号周报

  • 1、实现了多机同步下的光场集群渲染。
  • 2、完善实验室模型的漫游功能,接入视频。

7.1号周报

  • 1、多机同步添加了一个自动获取局域网ip并改为广播地址的功能。
  • 2、添加了几个跳转按钮在三维数字实验室上

7.30号周报

  • 1、完成了实验室和学校场景的自动漫游,手动漫游,视点跳转,场景切换,udp通信,三维坐标与经纬度的转换
  • 2、将小场景集成到平台上

项目进展

TK

使用TouchScript插件做多点触控。实现双屏显示(普通3D和光场)。

超级大坑

实现后发布出Unity项目后UI不能触发事件.解决办法如下图。

Touchscript error 01.png

化工园区三维可视化插件

NPAPI插件开发:与JS交互

视频插件

三维可视化插件

将VLC嵌入OSG

  • 已封装成DLL供OSG调用,经过测试视频延迟较低,播放流畅。

在OSG中做UI

  • 实现了将Billboard与Text结合,创建一个带有背景板的文字模型,并封装成DLL供OSG调用。
  • 实现了添加一个模型,在模型前添加文字,并且根据给定的结构体数组的个数进行分页显示,并实现了切换页面文字数据。
  • c++中拼接字符串,用string拼接,再用.c_str()转char*,
  • 与美工合作完成了表格的设计与数据的添加、分页、换页
  • 封装了添加数据的js接口。
  • 将数据写入文件做调试,发现js添加表格数据时是由于数据类型错误导致插件崩溃。(记录下C++写文件代码,以便下次使用)
std::fstream fout;
fout.open("E:\\1.txt", std::ios_base::out | std::ios_base::app); //只写形式打开文件2,如果文件存在则清空文件内容
if (!fout.is_open())
{
	perror("打开文件失败!\n");
	exit(0);
}
else
{
	fout.write((char*)val, strlen(val));
	fout.write(",", 1);
}
fout.close();;
  • 添加表格UI遇到的问题:第一次添加时点击事可以正常使用,移除表格UI后第二次添加时触发点击事件导致插件崩溃。
  • 排查问题:发现是由于每次创建表格对象的时候都会绑定一次点击事件,移除表格时并没有移除所绑定的点击事件,导致重复绑定事件,插件崩溃。
  • 解决方法:重新修改了添加表格UI的逻辑,将表格数据和对应的表格名称与数据的Map都封装在一个单例类中,通过单例类中的方法对表格数据和Map进行操作。将原本点击事件中的对表格数据中的操作抽离出来,在地球初始化之前只调用一次添加事件即可。然后将单例类中的表格数据在移除表格的时候clear一下。

学习笔记

图形学基础知识

变换

二维变换

  • 仿射变换 = 线性变化+平移变化(引入了其次坐标,升一维做运算)
  • 2D Point[math](x,y,1)^T[/math] 2D Vector[math](x,y,0)^T[/math]
  • [math](x,y,w)^T[/math] is 2D point[math](x/w,y/w,1)^T,w!=0[/math]
  • 两个二维point相加,得到的是两个point的中点。
  • 变换矩阵*向量,先做线性变换,再做平移变换。
  • 2D的矩阵变换:
    • 缩放
      2d矩阵缩放.png
    • 旋转
      2d矩阵旋转.png
    • 平移
      2d矩阵平移.png

三维变换

  • 类比二维,平移与缩放基本相同
  • 旋转(需要注意绕y轴旋转的矩阵参数)
    • 绕x轴旋转
      3d x矩阵旋转.png
    • 绕y轴旋转
      3d y矩阵旋转.png
    • 绕z轴旋转
      3d z矩阵旋转.png
  • 三维模型到二维图像的变换
3d to 2d.png
  • Projection transformation
    • Orthographic projection(正交投影)
      • 正交投影矩阵
        正交投影矩阵.png
    • Perspective projection(透视投影)
      • 推导透视投影矩阵,首先将视景体变换为长方体,然后再做一次正交投影即可。[math]M_{presp} = M_{ortho}M_{persp-\gt ortho}[/math]
        F to C.png
      • 推导[math]M_{persp-\gt ortho}[/math]
        • Far to near.png
          因此可以推导出Far to near 1.png
          所以我们可以根据Far to near 3.png推导出Far to near 4.png
        • 根据视景体变换为长方体的两个性质:变换后近平面和远平面的z不变,且远平面变换后中心点不变。
          可以推导出近平面在z轴的向量变换有以下关系Far to near 5.png
          远平面在z轴的向量变换有以下关系far_to_near_6
          因此可以得到两个等式,并求得A、BFar to near 7.png
        • 最后推导出的投影变换矩阵为Far to near 8.png
  • 最后一步:将变换到[math][-1,1]^3[/math]空间坐标下的图像经过视口变换,最终显示在屏幕上。
  • 视口变换矩阵(在不考虑z轴的情况下)视口变换矩阵.png
  • 另外的几个参数概念:
    • 宽高比:[math]Aspect = width/height[/math]
    • 视场:
      Horizontal Field of View = [math]arctan(width/2d)[/math]
      Vertical Field of View = [math]arctan(height/2d)[/math]
      (其中,d是相机到屏幕的距离)

光栅化

  • 判断当前屏幕像素是否在变换以后的图像中间(从最简单的三角形开始考虑),即判断当前像素点是否在三角形内部,如果在则将此像素颜色进行变换。
  • 光栅化则会导致一个问题:根据采样的频率不同,导致最终的图像具有锯齿和走样。
  • 采样带来的问题:走样、摩尔纹
  • 反走样(抗锯齿):先做模糊,再做采样。具体的做法有MSAA(多重采样抗锯齿)、FXAA(快速近似抗锯齿)、TAA(时间性抗锯齿)

深度缓存(Z-Buffer)

  • 光栅化的过程中会遇到图像深度的问题,由此引入深度缓存算法。会同时生成深度图、渲染图。
  • 基本思想:每一个像素内记录最浅的深度。
    Z-buffer.png

着色(Shading)

漫反射

  • 不受观看方向的影响
    漫反射 01.png
  • 求漫反射:已知一个点光源,求光源的光传播到shading point的附近的强度。
    漫反射 02.png

高光

  • 与观看方向有关
  • 由下图可知,当观看角度距离光的反射方向越近,越能看到高光。
    高光 01.png
  • 根据Blinn-Phong Reflection Model,我们可以求得向量l和向量v的半程向量,判断半程向量与法线的夹角,来判断向量v与反射方向R的远近。
    高光 02.png
  • 半程向量公式高光 03.png
  • 因此高光的公式为
    高光 04.png

    p指数是为了减小高光范围

环境光

  • 假设环境光是个常量,不受光源、观看方向的影响。
    环境光 01.png

Blinn-Phong Reflection Model

  • 由上述三种现象可得出
    Blinn-Phong Reflection Model.png

着色频率

  • 对于同一模型的不同着色方法(将着色应用在哪些地方)
  • 面片着色
    • 计算出每一个面片的法线,并对整个面片进行着色。
  • 顶点着色
    • 计算出每个面片顶点的法线,并对顶点进行着色,顶点围成的面片中间用插值来进行着色。顶点法线等于相邻面的法线求平均(可能是加权平均,权重为三角形面积)
  • 像素着色
    • 计算出每个面片顶点的法线,然后利用插值计算出顶点围成的面片中间的每个像素的法线,然后对每个像素进行着色。

纹理映射

  • 将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。
Mipmap
  • 根据距观看者远近距离的不同,以不同的分辨率将单一的材质贴图以多重图像的形式表现出来并代表平面纹理:尺寸最大的图像放在前面显著的位置,而相对较小的图像则后退到背景区域。
    将低一级图像的每边的分辨率取为高一级图像的每边的分辨率的二分之一,而同一级分辨率的纹理组则由红、绿、蓝三个分量的纹理数组组成。

插值

  • 根据三角形的重心坐标来插值顶点的各种属性(位置,颜色,深度等)
  • 三角形ABC内部任意一点的重心坐标(α,β,γ)满足αA + βB + γC = 1,且α,β,γ非负。
双线性插值(Bilinear interpolation)
  • 根据图中所示,求两个纹素之间的纹素信息。需要用到相邻的四个纹素的信息(做两次横向线性插值,和一次纵向线性插值即可)
    双线性插值.png
三线性插值(Trilinear interpolation)
  • 根据图中所示,求Mipmap的两个相邻Level之间的纹素信息,做两次双线性插值,求得每一层的纹素信息,再根据两个相邻层之间做一次线性插值。
    三线性插值.png

几何

贝塞尔曲线

曲面细分

曲面简化(Mesh Simplification)

二次误差度量(Quadric Error Metrics)
  • 基于边折叠,误差测度采用的是二次误差测度,采用点到平面距离的平方作为误差测度。
    QEM 01.png

光线追踪

计算机图形学中的数学方法

C++类封装DLL及其使用

封装

在头文件中定义

#pragma once
#ifdef 一般为头文件名
#define 接口声明的名称 _declspec(dllexport)
#else
#define 接口声明的名称  _declspec(dllimport)
#endif
class 接口声明的名称 类名
{
public:
	类成员方法
};

在函数实现的cpp文件中也要做出定义

#define 一般为头文件名

然后生成dll、lib等文件

使用

将生成的dll、lib以及被封装代码的头文件收集起来

头文件所在的目录写入 属性-》包含目录下、lib所在的目录写入 属性-》库目录下、然后将lib文件名写入 属性-》输入-》附加依赖项

最后在工程中添加

#include "被封装代码的头文件名"

即可使用

运行时将dll文件复制到可执行文件的根目录

OpenGL

顶点数组对象:Vertex Array Object,VAO

顶点缓冲对象:Vertex Buffer Object,VBO

索引缓冲对象:Element Buffer Object,EBO或Index Buffer Object,IBO

关于VAO和VBO关系的理解

https://www.pianshen.com/article/647381560/

着色器

典型着色器的结构

#version version_number
in type in_variable_name;
in type in_variable_name;

out type out_variable_name;

uniform type uniform_name;

int main()
{
  // 处理输入并进行一些图形操作
  ...
  // 输出处理过的结果到输出变量
  out_variable_name = weird_stuff_we_processed;
}

目前会编写一些简单的顶点着色器和片段着色器。

纹理

了解了纹理坐标。纹理环绕方式,纹理过滤,多级渐远纹理等。

坐标系统以及使用矩阵变换

局部空间(Local Space,或者称为物体空间(Object Space))

世界空间(World Space)

观察空间(View Space,或者称为视觉空间(Eye Space))

裁剪空间(Clip Space)

屏幕空间(Screen Space)

这就是一个顶点在最终被转化为片段之前需要经历的所有不同状态。

为了将坐标从一个坐标系变换到另一个坐标系,需要用到几个变换矩阵,最重要的几个分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。

摄像机

OpenGL本身没有摄像机(Camera)的概念,但可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种移动的感觉,而不是场景在移动。使用摄像机位置、摄像机方向、右轴、上轴这些摄像机向量就可以创建一个LookAt矩阵。

光照

OpenGL的光照使用的是简化的模型,对现实的情况进行近似,这样处理起来会更容易一些,而且看起来也差不多一样。其中一个模型被称为冯氏光照模型。冯氏光照模型的主要结构由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。分别通过向量计算(计算在片段着色器中进行)三种光照分量,并与物体颜色相乘,就能实现冯氏光照模型的效果。

为实现物体的真实性,需要对漫反射分量和镜面光分量有更精准的控制,这时引入漫反射和镜面光贴图。

贴图,其实原理和纹理一样:都是使用一张覆盖物体的图像,让我们能够逐片段索引其独立的颜色值。在光照场景中,它通常叫做一个漫反射贴图(Diffuse Map),它是一个表现了物体所有的漫反射颜色的纹理图像。

C++ Interop

先定义一个非托管C++类

class MyTestClass
{
    public:
        MyTestClass();
        virtual ~MyTestClass();
        void PassInt(int intValue);  //
        void PassString(char* strValue);  //
        char* ReturnString();  //
}

再定义一个托管包装类

//声明非托管类
class MyTestClass;
public ref class MyManagedClass
{
    public:
        MyManagedClass(); //创建非托管类实例
        virtual ~MyManagedClass(); //销毁非托管类实例
        void PassInt(int intValue);  //实现int类型的封送
        void PassString(String^ strValue);  //实现String类型的封送
        String^ ReturnString();  //返回String类型的封送
    private:
        MyTestClass* my_classobj;
}

在C#项目中调用该包装类

MyTestClass m_obj = new MyTestClass();
m_obj.PassInt(10);
m_obg.PassString("这是传递给C++的字符串。");
string retString = m_obj.ReturnString();
Console.WriteLine("这是C++传过来的字符串。");

封送字符串

char* PassString(String^ strValue)
{
    //将托管字符串封送为非托管Ansi字符串
    IntPtr pStrPtr = Marshal::StringToHGlobalAnsi(strValue);
    const char* pStr = static_cast<char*>(pStrPtr.ToPointer());
    //释放封送到非托管内存中的Ansi字符串
    Marshal::FreeHGlobal(pStrPtr);
    //将char*类型的字符串返回
    retrun pStr;
}


C++端定义一个带(void*)参数的函数用来将指针转换成IntPtr类型的变量,同时定义一个托管类型的成员变量Dictionary用于储存转换成IntPtr的指针,并在添加、删除函数最后返回Dictionary。

IntPtr getDic(void* Point)
{
    return (IntPtr)Point;
}

C#端在ComFunc文件中定义一个私有成员储存Dictionary的Dictionary变量用于数据保存,并创建一个接口函数用于操作此变量。C#端在调用C++函数时可直接调用此接口对Dictionary进行添加、删除等操作。

private Dictionary<string, Dictionary<string, IntPtr>> _pointList;
public ref Dictionary<string, Dictionary<string, IntPtr>> GetPointList()
{
    if (_pointList== null)
    {
        _pointList= new Dictionary<string, Dictionary<string, IntPtr>>();
    }
    return ref _pointList;
}

C++/CLR

  • C++/CLR与传统C++比较重要的区别
    • C++/CLR中没有传统C++中”指针“的概念,因为在C++/CLR中,是”运行时“帮你管理内存,因此指针中的地址会在不停的变化从而导致过期。因此使用句柄来包含变量的地址,”运行时“会自动更新这个地址。
    • 一般用gcnew操作符动态创建对象并获取他的句柄。
array<int> ^arr = gcnew array<int>(10);  //声明十个整数的数组


学习CLR遇到的问题

问题1: 为什么 C# 会将 C++ 中的 char* 转换为 sbyte* 呢?

这是因为 C++ 中的 char 占用一个字节,而 C#中 char 占用两个字节,所以不能讲 char* 直接转换为 C# 中的 char*, 而 sbyte 是有符号单字节,取值区间 [-128, 127],所以 C# 将 char* 转换成 sbyte* 是合理的。

问题2:CLR 的 dll 和普通的 dll (Native dll) 有什么区别呢?

CLR 有点类似于 java 的 “虚拟机” , 提供运行环境,负责检查 内存管理、安全、异常等比较容易出错的问题,提高程序的安全性和健壮性,是 .NET Framework 的主要引擎。在 CLR 监视下的代码称为 “托管代码 (managed)”, 而其他的不在其监管下的代码称为 “非托管代码 (unmanaged)”。在 CLR 环境下生成的代码是中间代码,有点类似于 java 的字节码。所以通过 CLR Dll 生成的 dll 类库是中间代码,普通的 dll 则是直接是本机化的二进制文件, 通过 CLR DLL 生成的 dll 是程序集 (Assembly), 可以在直接在C#工程中【添加引用】就可以直接调用,从前面的例子也可以看出来,不需要任何的 DllImport 之类的包含与结构体重定义,函数指针定义等等复杂的操作,使得调用更加简单。

解决办法

将char* 转换为 sbyte*:首先建立一个普通的 string 变量,然后新建一个指针,指向该 string的内容,再讲该指针强制类型转化为sbyte*, 从而实现从 char* 中获取内容。

imagelab工具

首先下载dlib的库文件,解压后找到文件夹下的tools文件下的imglab文件,编译成功以后。在cmd命令行下可以打开标记软件进行标记。

编译好的文件: 文件:Imglab.7z

使用方法:

下载后打开build文件夹下的Release文件,在Release文件夹下打开Power shell,输入

  .\imglab -c 文件名.xml 图片文件夹路径(这里面是你要标记的图像集)

然后输入

 .\imglab 文件名.xml

打开标图工具进行标图。

用法:按住shift然后用鼠标左键标框,双击选中所标的框,按住shift然后用鼠标左键标点。标完点后保存即可,用记事本打开xml文件即可看到被标注的点的坐标。

更多使用方法请参考这个网址: imglab使用方法

年终总结

2020年终总结

工作总结:

  • 将现有平台的pinvoke机制改造成osgclr机制,并测试其性能(3/4/5月)
  • 实现了多机同步下的光场集群渲染,为装甲兵项目做了前期准备(6月)
  • 完成了实验室和学校场景的自动漫游,手动漫游,视点跳转,场景切换,udp通信,三维坐标与经纬度的转换(7/8月)
  • 九月份开学以后出差连云港,参与开发716项目。时间两周。
  • 连云港出差回来以后,协助邢师兄参与开发装甲兵项目。时间两周。
  • 十月中旬,去往深圳参与开发天安云谷项目,期间协助调试装甲兵项目。时间一个月。
  • 十二月中旬,去往石家庄参与开发项目,时间五天。
  • 目前在整理代码,继续开发716项目,预计在元旦之前去往连云港将716项目结题。

占用资源:

  • 1.学位名额
  • 2.实验室工位
  • 3.设备,实验室提供的一台高性能台式机和一台高性能笔记本。

自我评价:

  • 1.功劳与苦劳大于占用资源。
  • 2.上半年主要在家办公,效率较低。
  • 3.下半年开学以后,由于项目较多,出差较多。增加了很多工程经验,但在以后的时间里还要继续努力,提高科研水平。

2019年终总结

编写unity小场景的自动漫游和第一人称手动漫游。
用DoTween插件实现了相机按照既定的轨迹自动漫游,但效果不太好。
实现了使用键盘和鼠标滚轮使得相机进行前后左右移动,按下鼠标左键可以移动相机视角。

小场景
  • C#有效代码量约:236行

参与完成OSG三维可视化平台的路径漫游的保存与重现。
将路径漫游的路径信息保存在本地xml文件中,并在每次启动程序时读取后加载在左侧场景树中。

漫游的保存
  • C#有效代码量约:

修改大场景的问题,实现了大小场景的切换。将自由漫游中相机视角会随鼠标移动改为当鼠标左键按下时相机才会随鼠标移动。并且在调节时间滑块的时候将自由漫游状态取消。
添加两个按钮,用于开启和关闭背景声、开始和停止时间流动。
增加自由漫游中可以使用鼠标滚轮实现相机的前进后退,并可以使用加减号调节移动速度。

大场景
  • C#有效代码量约:121行

文件:屁屁踢.pptx