Просмотрите наши продукты

Aspose.3D for .NET 22,4 Примечания к выпуску

Улучшения и изменения

КлючСводкаКатегория
THREEDNET-1116Путаница в EulerAngle узла приводит к неправильному положению после вращения моделиИсправление ошибок
THREEDNET-1137LayeredTexture, импортированная из FBX, может генерировать недопустимый файл GLTFИсправление ошибок
THREEDNET-1119Поддержка пользовательских атрибутов vertex GLTFНовая функция
THREEDNET-1129GLB в U3D Преобразование привело к неправильной ориентацииНовая функция
THREEDNET-1121Поддержка экспорта облака точек в USD/USDZНовая функция
THREEDNET-1122Поддержка импорта облака точек в USD/USDZНовая функция
THREEDNET-1113Загружено OBJ модель потерянных координат текстуры vtИсправление ошибок
THREEDNET-1107Лицензия не может быть загружена, когда приложение построено как единый исполняемый файл.Исправление ошибок

API изменения

Все изменения API в этой версии необходимы для экспорта пользовательских данных в glTF-TriMesh, пользовательские данные в Mesh и VertexElementUserData будут поддерживаться в следующей версии.

Добавлены новые члены в класс Aspose.ThreeD.Utilities.SemanticAttribute:

        /// <summary>
        /// Semantic of the vertex field
        /// </summary>
        public VertexFieldSemantic Semantic { get; }
        /// <summary>
        /// Alias of the vertex field
        /// </summary>
        public string Alias { get; }

        /// <summary>
        /// Initialize a <see cref="SemanticAttribute"/>
        /// </summary>
        /// <param name="semantic">The semantic of the struct's field.</param>
        /// <param name="alias">Alias of the field.</param>
        public SemanticAttribute(VertexFieldSemantic semantic, string alias)

Новый добавленный конструктор позволяет указать псевдоним для поля вершины, который можно использовать для экспорта пользовательского имени поля в поддерживаемых экспортерах, таких как GLTF.

Метод обновления AddField в классе Aspose.ThreeD.Utilities.VertexDeclaration:

        /// <summary>
        /// Add a new vertex field
        /// </summary>
        /// <param name="dataType">The data type of the vertex field</param>
        /// <param name="semantic">How will this field used for</param>
        /// <param name="index">The index for same field semantic</param>
        /// <param name="alias">The alias name of the field</param>
        public VertexField AddField(VertexFieldDataType dataType, VertexFieldSemantic semantic, int index = -1, string alias = null)

В новый AddField добавлен новый парамтерПсевдонимЧтобы указать псевдоним поля, он работает точно так же, как и новый добавленный конструктор SemanticAttribute.

Добавлены члены в класс Aspose.ThreeD.Utilities.VertexField:

        /// <summary>
        /// Alias annotated by attribute <see cref="SemanticAttribute"/>
        /// </summary>
        public string Alias { get { return alias; } }

Кодовый фрагмент для экспорта пользовательских данных в glTF

public struct Vertex
{
        [Semantic(VertexFieldSemantic.Position)]
        public FVector3 position;
        [Semantic(VertexFieldSemantic.Normal)]
        public FVector3 normal;
        [Semantic(VertexFieldSemantic.UV)]
        public FVector2 texcoord;

        //Specify the Alias of this field to "_BATCH_ID"
        [Semantic(VertexFieldSemantic.UserData, "_BATCH_ID")]
        public float batchId;

        public Vertex(FVector3 position, FVector3 normal ,FVector2 texcoord, float batchId)
        {
                this.position = position;
                this.normal = normal;
                this.texcoord = texcoord;
                this.batchId = batchId;
        }
}
private unsafe static void ExportCustomFieldToGLTF()
{
        //Prepare the vertices and indices:
        var vertices = new Vertex[]
        {
                new Vertex(new FVector3(1, 0, 0), new FVector3(0, 1, 0), new FVector2(0, 0), 1),
                new Vertex(new FVector3(1, 1, 0), new FVector3(0, 1, 0), new FVector2(0, 1), 2),
                new Vertex(new FVector3(0, 1, 0), new FVector3(0, 1, 0), new FVector2(1, 0), 3),
                new Vertex(new FVector3(0, 1, 1), new FVector3(0, 1, 0), new FVector2(1, 1), 4),
        };
        var indices = new int[]
        {
                0, 1, 2,
                1, 2, 3
        };
        //Convert the vertices into raw bytes
        var verticesInBytes = new byte[vertices.Length * sizeof(Vertex)];
        fixed(Vertex* pSrc = vertices)
        {
                Marshal.Copy(new IntPtr(pSrc), verticesInBytes, 0, vertices.Length);
        }
        //Create a vertex declaration from reflection:
        var vd = VertexDeclaration.FromType<Vertex>();
        //construct a TriMesh from raw bytes of vertices and indices
        var mesh = TriMesh.FromRawData(vd, verticesInBytes, indices, false);
        //create a scene with the mesh
        var scene = new Scene(mesh);
        //export the scene to a binary glTF file
        scene.Save("test.glb", FileFormat.GLTF2_Binary);

        // The GLTF primitive generated in the test.glb will be:
        // {"attributes" : {"POSITION" : 0, "NORMAL" : 1, "TEXCOORD_0" : 2, "_BATCH_ID" : 3}, "mode" : 4}
}


 
 Русский