10、将osg的Geometry转换为虚幻引擎的UStaticMesh

这篇具有很好参考价值的文章主要介绍了10、将osg的Geometry转换为虚幻引擎的UStaticMesh。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

将osg::Geometry转换为FMeshDescription,通过FMeshDescription即可构建UStaticMesh,下面这段代码主要是为了转换倾斜摄影的osgb数据,但是倾斜摄影数据中本身不携带法线数据,也不需要计算法线,因此如果要转换其他携带或需要计算法线的osg::Geometry的数据,请另行将法线信息补充到FMeshDescription中文章来源地址https://www.toymoban.com/news/detail-859001.html

FMeshDescription ConvertOsgGeometryToMeshDescription(osg::ref_ptr<osg::Geometry> InGeometry)
{
	FMeshDescription result;
	//顶点
	osg::MixinVector<osg::Vec3f>* vertices = dynamic_cast<osg::MixinVector<osg::Vec3f>*>(InGeometry->getVertexArray());
	if (!vertices)
		return result;
	//纹理坐标
	osg::MixinVector<osg::Vec2f>* texCoords = dynamic_cast<osg::MixinVector<osg::Vec2f>*>(InGeometry->getTexCoordArray(0));
	assert(vertices->size() == texCoords->size());

	//法线,倾斜摄影数据没有法线,其实不需要
	osg::MixinVector<osg::Vec3f>* normals = dynamic_cast<osg::MixinVector<osg::Vec3f>*>(InGeometry->getNormalArray());
	//索引
	osg::MixinVector<unsigned int>* indices = dynamic_cast<osg::MixinVector<unsigned int>*>(InGeometry->getPrimitiveSet(0));
	if (!indices)
		return result;
	assert(indices->size() / 3 == 0);

	FStaticMeshAttributes attributes(result);
	//注册默认的静态模型属性
	attributes.Register();

	//FMeshDescriptionBuilder用于设置顶点、法线、UV坐标等信息
	FMeshDescriptionBuilder meshDescBuilder;
	meshDescBuilder.SetMeshDescription(&result);
	//允许使用多边形组
	meshDescBuilder.EnablePolyGroups();
	//设置UV坐标的级数为1
	meshDescBuilder.SetNumUVLayers(1);
	FPolygonGroupID GroupId = meshDescBuilder.AppendPolygonGroup();

	const uint32 vertexCount = vertices->size();
	TArray<FVertexID> vertexIDs;
	vertexIDs.SetNum(vertices->size());
	const float unit = 100.0;
	// 定义一个Lambda表达式,用于将OSG坐标转换为UE坐标
	auto ConvertOSGToUE = [&unit](const osg::Vec3f& OSGCoordinate) -> FVector
		{
			float X = OSGCoordinate.x() * unit;
			float Y = -OSGCoordinate.y() * unit; 
			float Z = OSGCoordinate.z() * unit; 

			return FVector(X, Y, Z);
		};
	for (uint32 i = 0; i < vertexCount; ++i) {
		const osg::Vec3f vertex = vertices->at(i);
		vertexIDs[i] = meshDescBuilder.AppendVertex(ConvertOSGToUE(vertex));
	}

	const uint32 indiceCount = indices->size();
	assert(indiceCount / 3 == 0);
	const uint32 triangleCount = indiceCount / 3;
	for (uint32 i = 0; i < triangleCount; ++i) {
		const uint32 indice1 = indices->at(i * 3);
		const FVertexInstanceID vertexInstanceId1 = meshDescBuilder.AppendInstance(vertexIDs[indice1]);
		const osg::Vec2f texCoord1 = texCoords->at(indice1);
		meshDescBuilder.SetInstanceUV(vertexInstanceId1, FVector2D(texCoord1.x(), 1 - texCoord1.y()), 0);

		const uint32 indice2 = indices->at(i * 3 + 1);
		const FVertexInstanceID vertexInstanceId2 = meshDescBuilder.AppendInstance(vertexIDs[indice2]);
		const osg::Vec2f texCoord2 = texCoords->at(indice2);
		meshDescBuilder.SetInstanceUV(vertexInstanceId2, FVector2D(texCoord2.x(), 1 - texCoord2.y()), 0);

		const uint32 indice3 = indices->at(i * 3 + 2);
		const FVertexInstanceID vertexInstanceId3 = meshDescBuilder.AppendInstance(vertexIDs[indice3]);
		const osg::Vec2f texCoord3 = texCoords->at(indice3);
		meshDescBuilder.SetInstanceUV(vertexInstanceId3, FVector2D(texCoord3.x(), 1 - texCoord3.y()), 0);

		meshDescBuilder.AppendTriangle(vertexInstanceId1, vertexInstanceId2, vertexInstanceId3, GroupId);

	}

	//FStaticMeshOperations::ComputeTriangleTangentsAndNormals(result);//倾斜摄影数据没有法线,不必计算
	return result;
}

到了这里,关于10、将osg的Geometry转换为虚幻引擎的UStaticMesh的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 利用 Visual Studio 2022 加速虚幻引擎应用开发

    自上次官宣对虚幻引擎的支持后,我们的开发团队一直在努力构建新一代的虚幻引擎集成功能。今天,我们很高兴地向你展示我们所开发的一系列用于提升游戏开发效率的各种新特性。在下面的文章中,你将了解如何查看流式日志,查看 Visual Studio 中的头文件工具警告,并了

    2023年04月12日
    浏览(50)
  • 虚幻引擎游戏开发过程中,游戏鼠标如何双击判定?

    UE虚幻引擎对于游戏开发者来说都不陌生,市面上有47%主机游戏使用虚幻引擎开发游戏。作为是一款游戏的核心动力,它的功能十分完善,囊括了场景制作、灯光渲染、动作镜头、粒子特效、材质蓝图等。本文介绍了虚幻引擎游戏开发过程中游戏鼠标双击判定,一起来看看吧

    2024年02月13日
    浏览(45)
  • 虚幻引擎5 AR开发教程03:创建第一个AR App

    在本教程中,我们将学习如何在项目中添加 AR 功能并在虚幻引擎 5 中创建我们的第一个 AR 应用程序。 步骤 01:创建和设置 UE5(虚幻引擎 5)AR 项目: 教程 01 = 右键单击内容浏览器 = 选择杂项 数据资产 = 选择 ARSessionConfig = 将其命名为(AR_DefaultSessionConfig)并保存。 = 打开

    2024年02月02日
    浏览(56)
  • 虚幻引擎架构自动化及蓝图编辑器高级开发进修班

    课程名称:虚幻引擎架构自动化及蓝图编辑器高级开发进修班 课程介绍 大家好 我们即将推出一套课程 自动化系统开发。 自动化技术在项目开发的前中后期都大量运用。如何您是一家游戏公司,做的是网络游戏,是不是经常会遇到程序员打包加部署需要半天时间,测试demo功

    2024年04月11日
    浏览(48)
  • 【程序员必备】UE4 C++ 虚幻引擎:详解JSON文件读、写、解析,打造高效开发!

    🙋‍♂️ 作者:海码007 📜 专栏:UE虚幻引擎专栏 💥 标题:【程序员必备】UE4 C++ 虚幻引擎:详解JSON文件读、写、解析,打造高效开发! ❣️ 寄语:人生的意义或许可以发挥自己全部的潜力,所以加油吧! 🎈 最后: 文章作者技术和水平有限,如果文中出现错误,希望大

    2024年02月03日
    浏览(54)
  • 虚幻4学习笔记(10)蓝图接口、拾取物品-射线检测

    B站UP谌嘉诚课程:https://www.bilibili.com/video/BV164411Y732 添加:内容浏览器 右键 蓝图 蓝图接口 新建Doorinterface 蓝图接口 添加canOpendoor 和test函数 test函数添加输入输出参数 组件添加蓝图接口后可以调用其函数 只有入参没有出参 可以当做事件调用 有出参可以当函数调用使用 使用

    2024年02月08日
    浏览(92)
  • 虚幻学习笔记10—C++函数与蓝图的通信

            除了上一章C++变量与蓝图通信讲的变量能与蓝图通信外,还有函数和枚举也可以和蓝图通信。函数的为”UFUNCTION“、枚举的为”UENUM“。 2.1、BlueprintCallable蓝图中调用   该函数时带执行的,带入如下。编译成功后在蓝图中输入后可以找到,并点击使用如

    2024年02月04日
    浏览(50)
  • OSG三维渲染引擎编程学习之八十五:“第八章:OSG文字” 之 “8.4 文字特效实例”

    目录 第八章 OSG文字 8.4 文字特效实例       适当的文字信息对于显示场景信息是非常重要的。在OSG中,osgText提供了向场景中添加文字的强大功能,由于有第三方插件FreeType的支撑,可完全支持TrueType字体。       TrueType是由AppleComputer公司和Microsoft公司联合提出的一种新型数

    2024年02月11日
    浏览(42)
  • 【UE 插件】UE4 虚幻引擎 插件开发(带源码插件打包、无源码插件打包) 有这一篇文章就够了!!!

    🙋‍♂️ 作者:海码007 📜 专栏:UE虚幻引擎专栏 💥 标题:【UE 插件】UE4 虚幻引擎 插件开发(带源码插件打包、无源码插件打包) 有这一篇文章就够了!!! ❣️ 寄语:将来的自己肯定会感谢现在努力的你! 🎈 最后: 文章作者技术和水平有限,如果文中出现错误,希

    2024年02月08日
    浏览(53)
  • OSG三维渲染引擎编程学习之七十七:“第七章:OSG场景图形交互” 之 “7.9 场景漫游”

    目录 第七章 OSG场景图形交互 7.9 场景漫游 7.9.1 场景漫游描述 7.9.2 自定义场景漫游器

    2024年02月07日
    浏览(59)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包