Unity利用深度图建模

这篇具有很好参考价值的文章主要介绍了Unity利用深度图建模。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

深度图建模

总结

深度图精度获取
地形生成算法

主要进展

  1. 获取深度图
    1. 获取深度图:主要是用这篇文章提供的工程生成
      https://www.immersivelimit.com/tutorials/unity-depth-camera-simulation?rq=depth

Unity利用深度图建模,unity,游戏引擎

  1. 通过深度图获取点集
    关键就是一个图坐标转换为世界坐标。
    设图的像素中心为原点中心,从中心到像素坐标向量为一个轴,深度图的灰度值为一个轴,两轴经过一定比例放缩得到世界坐标。
for (int i = 0; i < width; i += 10)
{
    for (int j = 0; j < height; j += 10)
    {
        //根据像素点与中心点偏移和深度值,得到实际点离摄像头的位移
        Vector2 pixelOffsetV2 = new Vector2(i, j) - new Vector2(i / 2, j / 2);
        float depthOffset = depthMap.GetPixel(i, j).r * 255;//深度图,r,g,b值都相同

        print(i + " " + j + " " + depthOffset);
        if (depthOffset < 250)
        {
            //转换三维向量
            Vector3 pixelOffsetV3 = new Vector3(pixelOffsetV2.x, pixelOffsetV2.y, 0) * pixelK;
            Vector3 depthOffsetV3 = new Vector3(0, 0, depthOffset * depthK);

            //得到最终位移
            Vector3 realOffset = pixelOffsetV3 + depthOffsetV3;
            GameObject point = Instantiate(sphere, camera.transform.position + realOffset, Quaternion.identity, parent);
            points[i, j] = point;
        }
    }
}
  1. 渲染点云

    1. 通过gameobject实现点云
      最简单的方法,在每个点实例化一个小球,性能消耗较大,间隔取像素和剔除深度无穷远的像素,可较快并实时预览点云生成效果,实时调整轴放缩系数
      Unity利用深度图建模,unity,游戏引擎

    2. 通过mesh的点模式实现点云
      主要参考下面资料
      mesh结构的基本用法
      https://docs.unity.cn/cn/current/Manual/Example-CreatingaBillboardPlane.html
      mesh的点线渲染
      https://blog.csdn.net/zhudaokuan/article/details/119609315

      Unity利用深度图建模,unity,游戏引擎
      Unity利用深度图建模,unity,游戏引擎

  2. 构建三角面mesh
    关键在于三角索引的顺序,最近的像素点画三角形,距离信息由二维数组的索引号表示,通过遍历每个点和距离找到合适的三个点画三角形。
    想象每个点作为四边形的左下角的那个点,每个四边形可以画两个三角形,所以每个点可以画两个三角形,先画右下角,再画左上角。直到把所有点遍历完。

/// <summary>
/// 根据深度图生成三角面
/// </summary>
void InitTriMesh2()
{
    int width = depthMap.width;
    int height = depthMap.height;

    //将得到的点转化为二维数组,几何位置近的画四边形
    int[,] pointsIndex = new int[width, height];

    //算一下生成的点数
    int num = 0;
    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < height; j++)
        {
            float depthOffset = depthMap.GetPixel(i, j).r * 255;//深度图,r,g,b值都相同
            if (depthOffset < 250)//有效点
            {
                if (isOpsite)
                    depthOffset = 255 - depthOffset;//取反~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                num++;
            }
        }
    }

    positions = new Vector3[num];
    indices = new int[num * 6];//三个点组成三角形的三个顶点,按最大复用率算
    colors = new Color[num];
    int index = 0;

    //for (int i = 0; i < width; i += 10)
    //{
    //    for (int j = 0; j < height; j += 10)
    for (int i = 0; i < width; i++)
    {
        for (int j = 0; j < height; j++)
        {
            //根据像素点与中心点偏移和深度值,得到实际点离摄像头的位移
            Vector2 pixelOffsetV2 = new Vector2(i, j) - new Vector2(i / 2, j / 2);
            float depthOffset = depthMap.GetPixel(i, j).r * 255;//深度图,r,g,b值都相同
            if (isOpsite)
                depthOffset = 255 - depthOffset;//取反~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            print(i + " " + j + " " + depthOffset);
            if (depthOffset < 250)
            {
                //转换三维向量
                Vector3 pixelOffsetV3 = new Vector3(pixelOffsetV2.x, pixelOffsetV2.y, 0) * pixelK;
                Vector3 depthOffsetV3 = new Vector3(0, 0, depthOffset * depthK);

                //得到最终位移
                Vector3 realOffset = pixelOffsetV3 + depthOffsetV3;

                positions[index] = realOffset;

                pointsIndex[i, j] = index;//存储索引
                //indices[index] = index;
                colors[index] = Color.gray;
                index++;
            }
        }
    }

    //设置三角形索引
    int triIndex = 0;
    for (int i = 0; i < pointsIndex.GetLength(0); i++)
    {
        for (int j = 0; j < pointsIndex.GetLength(1); j++)
        {
            if (pointsIndex[i, j] != 0)//可能会抛弃掉第一个点 。分别找最近的点画两个三角形
            {
                //第一个三角形
                indices[triIndex] = pointsIndex[i, j];
                triIndex++;

                //找到右上角最近的
                int temI = i;
                int temJ = j;
                do
                {
                    temI++;
                    temI %= pointsIndex.GetLength(0);
                    temJ++;
                    temJ %= pointsIndex.GetLength(1);
                } while (pointsIndex[temI, temJ] == 0);//非有效索引就继续找

                indices[triIndex] = pointsIndex[temI, temJ];
                triIndex++;

                //找到右边最近的
                temI = i;
                temJ = j;
                do
                {
                    temI++;
                    temI %= pointsIndex.GetLength(0);
                } while (pointsIndex[temI, temJ] == 0);//非有效索引就继续找

                indices[triIndex] = pointsIndex[temI, temJ];
                triIndex++;


                //第二个三角形
                indices[triIndex] = pointsIndex[i, j];
                triIndex++;

                //找到上面最近的
                temI = i;
                temJ = j;
                do
                {
                    temJ++;
                    temJ %= pointsIndex.GetLength(1);
                } while (pointsIndex[temI, temJ] == 0);//非有效索引就继续找

                indices[triIndex] = pointsIndex[temI, temJ];
                triIndex++;


                //找到右上角最近的
                temI = i;
                temJ = j;
                do
                {
                    temI++;
                    temI %= pointsIndex.GetLength(0);
                    temJ++;
                    temJ %= pointsIndex.GetLength(1);
                } while (pointsIndex[temI, temJ] == 0);//非有效索引就继续找

                indices[triIndex] = pointsIndex[temI, temJ];
                triIndex++;
            }
        }
    }

    mesh = pointMeshObj.GetComponent<MeshFilter>().mesh;
    mesh.vertices = positions;
    mesh.colors = colors;
    mesh.SetIndices(indices, MeshTopology.Triangles, 0);

    //MeshUtility.Optimize(mesh);

}

Unity利用深度图建模,unity,游戏引擎

Unity利用深度图建模,unity,游戏引擎

发现精度比较低,后来发现是unity会将导入的图像压缩导致的,将图片设为不压缩,效果会好一些。但还是没有光滑的效果。

  1. unity地形系统
    unity 地形系统可以通过高度图去生成地形。但是由于图片格式和我的深度图与Unity高度图色差相反,以及一些未知的图片尺寸问题,我的深度图导入到地形中生成不了正常地形。

相反的,用适用于地形的高度图,放到我的方法里去跑,可以生成点云,但是生成不了正常的模型,更别提光滑,可见实现方法还有很大差距。
Unity利用深度图建模,unity,游戏引擎

Unity利用深度图建模,unity,游戏引擎

Unity利用深度图建模,unity,游戏引擎

很多参考资料都涉及到shader相关知识,不仅为了渲染,还有大量的计算,感觉无论从基础实现还是优化,应该都绕不开shader。

参考资料

获取深度图
https://www.immersivelimit.com/tutorials/unity-depth-camera-simulation?rq=depth

点云实现
https://docs.unity.cn/cn/current/Manual/Example-CreatingaBillboardPlane.html

https://blog.csdn.net/zhudaokuan/article/details/119609315

https://blog.csdn.net/zhudaokuan/article/details/120135224?spm=1001.2014.3001.5501

高度图地形建模
https://zhuanlan.zhihu.com/p/592083710

基于深度相机的三维物体与人体扫描重建
https://kns.cnki.net/kcms/detail/detail.aspx?dbcode=CDFD&dbname=CDFD1214&filename=1013178503.nh&uniplatform=NZKPT&v=5-FXszT_zVskmmsaWloNbXPQP3jK8b3p0_gQsE9cT4lccPv2cgo4_l6cQMtA0soq文章来源地址https://www.toymoban.com/news/detail-812040.html

到了这里,关于Unity利用深度图建模的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月11日
    浏览(27)
  • Unity Physics2D 2d物理引擎游戏 笔记

    2d 材质 里面可以设置 摩擦力 和 弹力 Simulated:是否在当前的物理环境中模拟,取消勾选该框类似于Disable Rigidbody,但使用这个参数更加高效,因为Disable会销毁内部产生的GameObject,而取消勾选Simulated只是禁用。 Kinematic 动力学刚体 动力学刚体不受重力和力的影响,而受用户的

    2023年04月24日
    浏览(76)
  • Unity和UE4两大游戏引擎,你该如何选择?

    目录 游戏引擎 2 —— 难易区别 编程语言 3 —— 游戏产品 UE4制作的游戏产品  Unity制作的游戏产品  产品类型 5 —— 资源商店 6 —— 人才需求 平均薪资 总结      Unity和UE4都是游戏引擎,所谓游戏引擎就是集成了复杂功能的游戏开发软件,他们帮我们实现了复杂的底层逻

    2023年04月08日
    浏览(28)
  • GODOT游戏引擎简介,包含与unity性能对比测试,以及选型建议

    GODOT,是一个免费开源的3D引擎。本文以unity作对比,简述两者区别和选型建议。由于是很久以前写的ppt,技术原因视频和部分章节丢失了。建议当做业务参考。 GODOT目前为止遇到3个比较重大的机遇,第一个是oprea的合作奖,第二个是用支持c#换来的微软的投资,第三个是虚幻

    2024年02月14日
    浏览(27)
  • Unity 开发人员转CGE(castle Game engine)城堡游戏引擎指导手册

    一、简介 2. Unity相当于什么GameObject? 3. 如何设计一个由多种资产、生物等组成的关卡? 4. 在哪里放置特定角色的代码(例如生物、物品)?Unity 中“向 GameObject 添加 MonoBehaviour”相当于什么? 5.Unity子目录相当于什么Assets? 6. 支持哪些模型格式? 7. 支持FBX模型格式吗? 8.

    2024年02月07日
    浏览(24)
  • SuperMap Hi-Fi 3D SDK for Unity制作游戏引擎材质

    kele     在交通,电力,规划等行业中,有的对象常常具有很强的质感,比如金属质感的 钢轨,电力塔;陶瓷材质的绝缘子;玻璃材质的建筑幕墙等,但常规方式的表现效果 往往差强人意。     游戏引擎(Unity3D)中已有丰富的材质资源库,比如玻璃,金属等材质,这

    2024年02月09日
    浏览(54)
  • 【毕业论文】| 基于Unity3D引擎的冒险游戏的设计与实现

    📢博客主页:肩匣与橘 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 肩匣与橘 编写,首发于 CSDN 🙉 📢生活依旧是美好而又温柔的,你也是✨  基于Unity3D引擎的冒险游戏的设计与实现 📢前言 摘要 Abstract 1 绪论 1.1 选题背景 1.2 研究目的及意义 2 开发工具

    2024年02月05日
    浏览(28)
  • 游戏开发常用引擎工具介绍对比区别(UE4,Unity,Cocos,LayaAir,[egret-白鹭])

    是一套为开发实时技术而存在的引擎工具。目前广泛应用于3D建模渲染、游戏开发中。它完善的工具套件以及简易的工作流程能够使开发者快速修改或查看成果,对于代码的依赖性很低。而完整公开的源代码则能让使用者自由修改和扩展引擎功能。 是面向开发人员的 3D/2D 游戏

    2024年02月13日
    浏览(27)
  • 吐槽laya:H5小游戏开发应该用什么引擎好?laya、cocos还是unity?

    我看有人推荐laya,放在H5小游戏的前三排名,这压根不靠谱。 laya只能算个半成品,整体非常垃圾,如果是首次选择游戏引擎,至少转去cocos,实在选laya,那也没办法了。 下面说说laya有什么问题,如果只是一些简单的bug什么的,我是不会花这个时间吐槽的,但是如下的问题实

    2024年02月13日
    浏览(20)
  • C语言与游戏引擎插件开发:Unity、Unreal Engine中C插件的编写与集成(一)

    目录 一、引言 C语言在游戏开发中的重要地位与优势 游戏引擎插件机制与C语言的价值 二、C语言基础与游戏开发特性 C语言核心特性及其在游戏开发中的应用 游戏引擎API对接关键概念与技巧 C语言在游戏开发领域占据着无可替代的重要地位,尤其在应对高性能计算需求与底层

    2024年04月29日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包