將osg::Geometry轉(zhuǎn)換為FMeshDescription,通過(guò)FMeshDescription即可構(gòu)建UStaticMesh,下面這段代碼主要是為了轉(zhuǎn)換傾斜攝影的osgb數(shù)據(jù),但是傾斜攝影數(shù)據(jù)中本身不攜帶法線數(shù)據(jù),也不需要計(jì)算法線,因此如果要轉(zhuǎn)換其他攜帶或需要計(jì)算法線的osg::Geometry的數(shù)據(jù),請(qǐng)另行將法線信息補(bǔ)充到FMeshDescription中文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-859001.html
FMeshDescription ConvertOsgGeometryToMeshDescription(osg::ref_ptr<osg::Geometry> InGeometry)
{
FMeshDescription result;
//頂點(diǎn)
osg::MixinVector<osg::Vec3f>* vertices = dynamic_cast<osg::MixinVector<osg::Vec3f>*>(InGeometry->getVertexArray());
if (!vertices)
return result;
//紋理坐標(biāo)
osg::MixinVector<osg::Vec2f>* texCoords = dynamic_cast<osg::MixinVector<osg::Vec2f>*>(InGeometry->getTexCoordArray(0));
assert(vertices->size() == texCoords->size());
//法線,傾斜攝影數(shù)據(jù)沒(méi)有法線,其實(shí)不需要
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);
//注冊(cè)默認(rèn)的靜態(tài)模型屬性
attributes.Register();
//FMeshDescriptionBuilder用于設(shè)置頂點(diǎn)、法線、UV坐標(biāo)等信息
FMeshDescriptionBuilder meshDescBuilder;
meshDescBuilder.SetMeshDescription(&result);
//允許使用多邊形組
meshDescBuilder.EnablePolyGroups();
//設(shè)置UV坐標(biāo)的級(jí)數(shù)為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;
// 定義一個(gè)Lambda表達(dá)式,用于將OSG坐標(biāo)轉(zhuǎn)換為UE坐標(biāo)
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);//傾斜攝影數(shù)據(jù)沒(méi)有法線,不必計(jì)算
return result;
}
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-859001.html
到了這里,關(guān)于10、將osg的Geometry轉(zhuǎn)換為虛幻引擎的UStaticMesh的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!