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

将osg::Geometry转换为FMeshDescription,通过FMeshDescription即可构建UStaticMesh,下面这段代码主要是为了转换倾斜摄影的osgb数据,但是倾斜摄影数据中本身不携带法线数据,也不需要计算法线,因此如果要转换其他携带或需要计算法线的osg::Geometry的数据,请另行将法线信息补充到FMeshDescription中

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;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值