胡松磊

来自CGTWiki
跳转至:导航搜索
照片


个人简介


生于1995年12月12日,籍贯河北省秦皇岛市。

2014级    燕山大学         信息科学与工程学院          电子信息工程       本科
2020级    北京邮电大学     信息光子学与光通信院        电子信息           研究生

主要研究方向是三维显示和计算机图形学
四级成绩:438
实验室电脑配置:无
Tel:18833514159
Email:hsl1995@qq.com

早会

  • 9.24 查鱼眼相机矫正的相关资料
  • 9.23 调整参数测试合成图
  • 9.22 通过多个相机解决合成和保存的问题
  • 9.17 在单独的程序上测试了shader,可以合成,不是shader的问题,在多视点程序里修改调用
  • 9.16 重写保存功能,可以保存合成后的多视点图
  • 9.14 完成合成多视点图的UI功能和保存功能,可以输出三种格式图片
  • 9.13 使用OpenCVForUnity插件,解决了BMP格式图片读取的问题
  • 9.10 完成多宫格合成图,但是在上面加上shader后多视点图全黑,找出并解决问题
  • 9.09 解决合成时只有第一张图正常显示的问题
  • 9.08 继续做unity合成多视点图
  • 9.07 用unity实现多视点图的合成
  • 9.06 完成模型的保存,加载,删除的功能
  • 9.01 帮助修改语音控制,为语音控制提供调用函数
  • 8.31 解决标注图片不能加载的问题
  • 8.30 重新搞615标注功能
  • 8.27 解决615全屏状态下,标注不能用的问题
  • 8.25 继续昨天没做完的雷达探测功能
  • 8.24 完成615雷达探测功能
  • 8.20 昨天完成了自定义模型加载功能移植,今天继续完成615剩余功能
  • 8.19 整理移植615全屏UI功能

周报

  • 7.15
  1. 复制不含光场相机的TKF项目并上传到git TKFgit
  • 7.14
  1. 完成TKF项目的摄像机漫游功能,鹰眼小地图功能
  • 7.09
  1. 完成unity加载osg模型项目在unity5.3.8上的移植
  2. 完成TKF项目的光场信息调整界面和帮助界面
  • 7.08
  1. 安装破解了unity5.3.8,测试unity加载osg模型项目在5.3.8上打开失败,准备做移植
  • 7.02
  1. 在麒麟系统上成功编译OSG,但在编译OSGearth的时候报错
  2. 在unity加载TKF倾斜摄影程序中加入触控屏移动及双指缩放功能
  • 6.25
  1. 在光场上测试人物动态建模的模型
  2. 在光场上加载TKF倾斜摄影模型
  3. 在麒麟系统上完成OSG编译环境配置,但在编译时遇到无法生成MakeFile的问题
已安装的OSG第三方库
  • 6.18
  1. 完成unity加载倾斜摄影的光场相机缩放功能


  • 6.16
  1. 解析每个osgb文件内的内容
    1. osgb文件可以用UltraEdit软件打开,显示为十六进制,其中第十二到十五字节为版本号,如图划线部分
    2. 目前unity加载osgb模型只能加载91版本
    3. 网上几乎没有对不同版本号区别的说明
80版本
91版本

文件:Osgb格式说明.zip

  • 6.11
  1. 在光场上测试了unity加载的倾斜摄影模型,存在部分问题
    1. 过高的建筑会导致出屏模糊
    2. 目前暂时不支持缩放功能
  • 5.28
  1. 完成unity加载倾斜摄影模型,FPS在20-40波动。
  • 5.21
  1. 整理unity3D8K播放器程序
  2. 把OBJ模型加入unity并导出适合光场播放的版本
    1. 存在问题:在光场上显示时有重影
    2. 解决方案:调整多视点相机参数
  • 4.28-5.17
  1. 对悬浮光场和电子沙盘的模型进行渲染和合成
  • 4.23
  1. 调整Blender渲染的动画
  2. 学习OSG相关内容
  • 4.16
  1. 解决unity导出限定日期的软件,通过修改本地日期,在过期后仍可使用的问题
  2. 学习用Blender渲染多视点动画,因为调整相机阵列位置,导致动画的位置和大小需要修改(未完成),所以目前只渲染出了单帧效果
  • 4.09
  1. 完成unity相机漫游器
  2. 调试unity直接加载osgb模型的程序
  • 4.02
  1. 修改unity相机漫游器
  2. 尝试使用读取的OSGB数据在unity中生成Mesh
  3. 和郑玮泽刘昊细化倾斜摄影模型快速可视化方法的流程图
流程图.png
  • 3.26 初步完成unity内摄像机漫游器的编写
  1. 点击鼠标左键转动摄像机功能
  2. 转动鼠标滚轮缩放功能
  • 3.19 完成跳转视角普适性修改
  • 1.31 完成自动加载普适性修改,完成平台unity进度条修改
  • 1.18 完成平台自动加载模型功能,完成点击模型移动视角功能
  • 9.06 实现楼层拆解脚本动画

文件:Building.rar

  • 8.30 完成楼层拆解脚本


学习笔记

Unity

设置导出软件使用期限

  • 最开始使用DateTime.Now获取系统时间,与提前设置的使用时间对比,如果超时软件推出。
    • 存在问题:如果修改系统时间,则可以在超时的情况下继续使用。
    • 解决方法:使用WebRequest、WebResponse等函数来获取网络时间,如果未联网不能获取网络时间,则程序退出,如果获取到网络时间,则与提前设置的使用时间对比,如果超时软件退出。
    • 参考链接:Unity获取网络时间

流程图

触控屏双指缩放

  • 摄像机的拉近拉远,通过这种方式实现图像上的放大缩小。
  • m_zoom是摄像机的对象,或摄像机某层父节点的对象,通过对它与场景中物体之间的位置变换,达到图像上放大缩小的效果。
  • Input.touchCount用于检测当前触碰的数量。Input.touchCount == 2表示当前接收到2个触碰信息。
  • Input.touches[0]和Input.touches[1]是获取触碰信息,其中的数字便是触碰信息的相关索引。
public Transform m_zoom;
private float max = 3.7f;
private float min = 0;
protected static float current = 0;
private float last = -1;
void Update()
{
    if (Input.touchCount == 2)
    {
        float dis = Vector2.Distance(Input.touches[0].position, Input.touches[1].position);//两指之间的距离
        if (-1 == last) last = dis;
        float result = dis - last;//与上一帧比较变化
        if (result + current < min)//区间限制:最小
            result = min - current;
        else if (result + current > max)//区间限制:最大
            result = max - current;
        result *= 0.1f;//系数
        m_zoom.position += m_zoom.forward.normalized * result;
        current += result;//累计当前
        last = dis;//记录为上一帧的值
    }
    else
    {
        last = -1;//不触发逻辑时
    }
}

Dotween Path 路径动画

  • transform.DOPath().SetOptions().SetLookAt().OnComplete(delegate (){ });

API

  • DOPath(Vector3[] waypoints,float duration,PathType pathType = Linear,PathMode pathMode = Full3D,int resolution = 10,color gizmoColor = null)
  • waypoints: 是提供路径上点的坐标,需要按顺序添加进数组
  • duration:路径动画的整体持续时间
  • pathType:路径类型(就是点于点之间路径连线的生成方式)它内部预定义了两种类型
    • Linear:直线
    • CatmullRom:曲线
  • pathModel: 路径模式(用于确定正确的LookAt方向)它内部定义了四种类型
    • Ignore:忽略此参数和设置的LookAt参数
    • Full3D:在3d场景下,代表物体可以看向任何方向
    • TopDown2D:代表物体只能上下旋转,看向物体
    • Sidescroller2D:代表物体只能左右旋转看向物体
  • resolution:路径分辨率,代表路径点之间的曲线由多少个点构成,也就是点越多,曲线就越圆,此参数在直线路径类型下无效
  • gizmoColor:在Scene视图中,生成的路径曲线的颜色

设置选项

  • SetOptions
    • SetOptions(bool closePath,AxisConstraint lockPosition = AxisConstraint.None,AxisConstraint lockRotation = AxisConstraint.None)
    • closePath:是否是封闭路径,设为true的话,会形成闭环,最后运动回起点
    • lockPosition:锁定位置,参数为轴向,例如,填入AxisConstraint.X的话,横向的位移将被锁定,物体只能在其他方向上移动
    • lockRotation:锁定旋转,参数为轴向,和锁定位置同理,锁定的轴向不能旋转
  • SetLookAt
    • SetLookAt(Vector3 lookAtPosition/lookAtTarget/lookAhead,Vector3 forwardDirection,Vector3 up = Vector3.up)
    • 第一个参数的改变,有三种重载
      • Transform类型参数 lookAtTransform:也就是要看向的物体
      • Vector3类型参数 lookAtPosition:也就是要看向的位置
      • float类型的参数 lookAhead:一个向前看的参数
    • 后两个参数,是提供看向的轴向

回调函数

  • OnComplete:当DoTween动画调用完成后调用
  • OnKill:当DoTween动画被杀死的那一刻调用
  • OnPause:当DoTween动画暂停的那一刻调用
  • OnPlay:当DoTween动画开始的那一刻调用
  • OnRewind:当重复DoTween动画的那一刻调用,这个主要适用于路径loop的情况
  • OnStart:当DoTween动画第一次播放时调用,跟OnPlay的区别是,OnPlay在每一次暂停再开始都会调用,OnStart只调用一次
  • OnStepComplete:当DoTween完成一个循环周期时候调用
  • OnUpdate:当DoTween运行的时候一直调用
  • OnWaypointChange:当路径点变化的时候调用,主要用于DoPath函数

Opencv For Unity

        Mat mat = Imgcodecs.imread(path, -1);   //读取图片,path为本地路径
        Imgproc.cvtColor(mat, mat, Imgproc.COLOR_BGR2RGB);//因为opencv三通道的图片像素的组成是(B,G,R),而unity像素的组成是(R,G,B),所以要转化,不然颜色错误
        var texture = new Texture2D(mat.width(), mat.height(), TextureFormat.RGBA32, false);//创建texture
        Utils.matToTexture2D(mat, texture);//把mat格式转换为unity的texture

Blender

静(动)态图渲染

  • 相机阵列的设置以及视图的输出
  1. 设置主相机的位置、朝向、FOV
  2. 设置相机阵列的X轴方向相机数目、Y轴方向相机数目、FOV(FOV参数要与主相机的FOV一致)、X轴相机间距、Y轴相机间距和相机到零平面距离(与主相机的相机坐标一致)
  3. 设置平行拍摄或离轴拍摄(一般选取离轴拍摄,符合人眼观看特性)
  4. 放置相机阵列
  5. 设置两次保存路径
  6. 设置分辨率和文件格式(设置多帧渲染的起始与结束帧数)
  7. 渲染(多帧渲染)


OSG

OSG核心库

OSG 核心库提供了用于场景图形操作的核心场景图形功能、类和方法;开发 3D 图形程序所需的某些特定功能函数和编程接口;以及 2D 和 3D 文件 I/O 的OSG 插件入口。OSG 核心库包含了以下四个链接库:

  • 1.osg链接库
    • 命名空间:osg
    • 头文件:<OSG_DIR>/include/osg
    • Windows 库文件:osg.dll,osg.lib
    • 场景图形类
      • Node:Node 类是场景图形中所有节点的基类。它包含了用于场景图形遍历、拣选、程序回调,以及状态管理的方法。
      • Group:Group 类是所有可分支节点的基类。它是场景图形空间组织结构的关键类。
      • Geode:Geode 类(即 Geometry Node)相当于 OSG 中的叶节点。它没有子节点,但是包含了 osg::Drawable 对象,而 osg::Drawable 对象中存放了将要被渲染的几何体。
        • Drawable:Drawable 类是用于存储几何数据信息的基类,Geode 维护了一个 Drawable 的列表。Drawable 是纯虚类,无法直接实例化。用户必须实例化其派生类,如 Geometry,或者 ShapeDrawable。
        • Geometry:Geometry 类与 PrimitiveSet 类相关联,实现了对 OpenGL 顶点数组功能的高级封装。Geometry 保存顶点数组的数据,纹理坐标,颜色,以及法线数组。OSG嵌入unity时所需要输出的数据
        • PrimitiveSet:PrimitiveSet 类提供了 OpenGL 顶点数组绘图命令的高层次支持。用户可以从相关的 Geometry 类中取得保存的数据,再使用这个类来指定要绘制的几何体数据的类型。
        • Vector 类(Vec2,Vec3 等):OSG 提供了预定义好的二维,三维和四维元素向量,支持 float 或者 double 类型。使用这些向量来指定顶点、颜色、法线和纹理坐标的信息。
        • Array 类(Vec2Array,Vec3Array 等):OSG 定义了一些常用的数组类型,如用于贴图纹理坐标的 Vec2Array。指定顶点数组数据时,程序首先将几何数据保存到这些数组中,然后传递至 Geometry 类对象。
      • LOD:LOD 类根据观察点与图像子节点的距离选择显示子节点。通常使用它来创建场景中物体的多个显示层级。
      • MatrixTransform:MatrixTransform 类包含了用于实施子节点几何体空间转换的矩阵,以实现场景对象的旋转、平移、缩放、倾斜、映射等操作。
      • Switch:Switch 类用布尔掩板来允许或禁止子节点的运作。
      • 其它节点内容参考 osg 库的头文件。
    • 状态管理类
      • 状态集合(StateSet):OSG 在 StateSet 类中保存一组定义状态数据(模式和属性)。
      • 模式(Modes):模式用于打开或关闭 OpenGL 固定功能(fixed-function)的渲染管道。方法 osg::StateSet::setMode()在 StateSet 中保存一个模式信息。
      • 属性(Attributes):应用程序使用属性来指定状态参数。方法 osg::StateSet::setAttribute()在 StateSet 中保存属性信息。
      • 纹理模式和属性:纹理模式和属性可应用在 OpenGL 多重纹理的某个指定纹理单元上。应用程序必须在设定纹理模式和属性时提供纹理单元的信息。StateSet类的方法setTextureMode()和setTextureAttribute()用于设定状态参量以及纹理单元信息。
      • 继承标志:OSG 提供了一些标志量,用于控制场景图形遍历中的状态值。
    • 其他实用类
      • Referenced:Referenced 类是所有场景图形节点和 OSG 的许多其它对象的基类。它实现了一个用于跟踪内存使用情况的引用计数(reference count)。如果某个继承自 Referenced 的对象,其引用计数的数值到达0,那么系统将自动调用其析构函数并清理为此对象分配的内存。
      • ref_ptr<>:模板类 ref_ptr<>为其模板内容定义了一个智能指针,模板内容必须继承自 Referenced 类(或提供一个与之相同的、能实现引用计数的接口)。当对象的地址分配给 ref_ptr<>时,对象的引用计数将自动增加。同样,清除或者删去 ref_ptr 时,对象的引用计数将自动减少。
      • Object:纯虚类 Object 是 OSG 中一切需要 I/O 支持,拷贝和引用计数的对象的基类。所有的节点类,以及某些 OSG 对象均派生自 Object 类。
      • Notify:osg 库提供了一系列控制调试,警告和错误输出的函数。用户可以通过指定一个来自 NotifySeverity 枚举量的数值,设定输出的信息量。OSG 中的大部分代码模块执行时都会显示相关的信息。
  • 2.osgUtil 链接库
    • 命名空间:osgUtil
    • 头文件:<OSG_DIR>/include/osgUtil
    • Windows 库文件:osgUtil.dll,osgUtil.lib
    • osgUtil 库集合了许多用于场景图形处理和几何体修改的工具。osgUtil 库最知名之处可能就是其中一系列支持更新、拣选和绘制遍历的类。在典型的 OSG程序中,这些遍历由更高层次的支持类,例如 osgViewer::Viewer 来进行处理,用户不需要直接和它们进行交互。
    • 交运算:通过提供大量用于场景图形交运算的类,osgUtil 库可以高效地支持拾取操作。当用户程序从需要进行图形对象拾取的用户那里接收到事件输入时,可以使用Intersector,IntersectionVisitor,LineSegmentIntersector,PolytopeIntersector,PlaneIntersector等类,获得场景图形中被拾取部分的信息。
    • 优化
      • Optimizer:Optimizer类用于优化场景图形。其属性使用一组枚举标志进行控制,每一个标志都表示一种特定的优化方式。
      • Statistics和StatsVisitor:StatsVisitor 类返回一个场景图形中节点的总数和类型,而 Statistics 类返回渲染几何体的总数和类型。
    • 几何体操作
      • Simplifier:使用 Simplifier 类减少 Geometry 对象中几何体的数目,这有助于低细节层次的自动生成。
      • Tessellator:OpenGL 不直接支持凹多边形和复杂多边形。Tessellator 类可根据一组顶点的列表,生成由前述顶点列表所描述的多边形。
      • DelaunayTriangulator:这个类实现了 Delaunay 三角网格化运算,根据一组顶点的集合生成一系列的三角形。
      • TriStripVisitor:TriStripVisitor 类可遍历场景图形并将多边形图元转换成三角形和四边形条带。
      • SmoothingVisitor:SmoothingVisitor 类可生成顶点法线,也就是所有共享此顶点的面的法线平均值。
      • 纹理贴图生成:osgUtil 库包含了帮助建立反射贴图,中途向量(half-way vector)贴图,以及高光贴图的代码。
  • 3.osgDB 链接库
    • 命名空间:osgDB
    • 头文件:<OSG_DIR>/include/osgDB
    • Windows 库文件:osgDB.dll,osgDB.lib
    • osgDB 库允许用户程序加载、使用和写入 3D 数据库。它采用插件管理的架构,可以支持大量常见的 2D 图形和 3D 模型文件格式。osgDB 负责维护插件的信息注册表,并负责检查将要被载入的 OSG 插件接口的合法性。由于大型的 3D 地型数据库通常是多段数据块的组合体。因此,应用程序从文件中读取各部分数据库信息时,需要在不干扰当前渲染的前提下以后台线程的方式进行。osgDB::DatabasePager 提供了这样的功能。
  • 4.osgViewer 链接库
    • 命名空间:osgViewer
    • 头文件:<OSG_DIR>/include/osgViewer
    • Windows 库文件:osgViewer.dll,osgViewer.lib
    • osgViewer 库定义了一些视口类,因而可以将 OSG 集成到许多视窗设计工具中。
      • SimpleViewer:SimpleViewer 类负责管理单一场景图形中的单一视口。
      • Viewer:Viewer 类用于管理多个同步摄像机,他们将从多个方向渲染单一的视口。
      • CompositeViewer:CompositeViewer 类支持同一场景的多个视口,也支持不同场景的多个摄像机。CompositeViewer 可以用来创建抬头数字显示(HUD),预渲染纹理(prerender textures),也可以用于在单一视口中显示多个视图。

NodeKits

NodeKits 扩展了 Nodes,Drawables 和 StateAttributes 的概念。NodeKits 还能够提供对.osg 的封装(一种支持对.osg 文件进行读写的 OSG 插件)。NodeKit 由两部分组成:NodeKit 本身,以及针对.osg 的封装插件库。

  • osgFX 库:此类 NodeKit 提供了额外的场景图形节点,以便于特效的渲染(异向光照,凹凸贴图,卡通着色等)。
  • osgParticle 库:此类 NodeKit 提供了基于粒子的渲染特效,如爆炸、火焰、烟雾等。
  • osgSim 库:此类 NodeKit 提供了仿真系统中以及渲染 OpenFlight 数据库所需的特殊渲染功能,例如地形高程图,光点节点,DOF 变换节点等。
  • osgText 库:此类 NodeKit 提供了向场景中添加文字的得力工具,可以完全支持 TrueType 字体。
  • osgTerrain 库:此类 NodeKit 提供了渲染高度场数据的能力。
  • osgShadow 库:此类 NodeKit 提供了支持阴影渲染的框架结构。

OSG 插件

OSG 的核心库提供了针对多种 2D 图形和 3D 模型文件格式的 I/O 支持。osgDB::Registry 可以自动管理插件链接库。只要提供的插件确实可用,Registry就可以找到并使用它,应用程序只需调用相应的函数来读取和写入数据文件即可。
OSG 插件允许用户程序仅仅通过编写几行代码就能够从磁盘中调用整个场景图形,或者调用部分的场景图形,然后应用程序可以将其列入整个场景图形系统中去。

内存管理

  1. 将派生自 Referenced 的对象赋予 ref_ptr<>变量,这一动作将自动调用Referenced::ref()并使引用计数加一。
  2. 如果将 ref_ptr<>变量指向其它的对象,或者将其释放,那么将调用Referenced::unref()方法,使引用计数减一。当计数器的值为 0 时,unref()自动释放对象所占用的内存空间。
  3. 为新的 Referenced 对象开辟内存空间时,要尽量将其赋予 ref_ptr<>,以保证 OSG 的内存管理工作正确。

2020年终总结

  • 工作总结:
  1. 使用unity实现楼层拆解功能(8月)
  2. 完成中铁安卓PC联动项目(9月至12月)
  3. 完成楼层拆解专利(11月)
  4. 出差石家庄协助师兄完成HTC交互项目(12月)
  • 占用资源:
  1. 学位名额,感谢老师们的信任与栽培。
  2. 研一时分复用实验室工位。
  • 自我评价:
  1. 半年的时间里,功劳与苦劳约等于占用资源。
  2. 自己项目推进缓慢,工作效率需要提高。