Exemple #1
0
        internal static void _AddCameraTo(CameraTransform3D?_Camera, GLTFWriteSettings?settings, SharpGLTF.Scenes.SceneBuilder scene)
        {
            if (!_Camera.HasValue)
            {
                return;
            }

            var vcam = _Camera.Value;

            var camNode = new SharpGLTF.Scenes.NodeBuilder("CameraNode");

            camNode.WorldMatrix = vcam.WorldMatrix;

            var cam = vcam;

            cam.WorldMatrix = Matrix4x4.Identity;
            vcam            = cam;

            if (vcam.TryGetPerspectiveFieldOfView(out var vfov))
            {
                var persp = new SharpGLTF.Scenes.CameraBuilder.Perspective(null, vfov, 0.1f);

                scene.AddCamera(persp, camNode);
            }

            else if (vcam.TryGetOrthographicScale(out var oscale))
            {
                var ortho = new SharpGLTF.Scenes.CameraBuilder.Orthographic(oscale, oscale, 0.1f, 1000);

                scene.AddCamera(ortho, camNode);
            }

            if ((settings?.CameraSize ?? 0) > 0)
            {
                var camMesh = new GltfMeshScene3D();

                vcam.DrawCameraTo(camMesh, settings.Value.CameraSize.Value);
                vcam.DrawFustrumTo(camMesh, settings.Value.CameraSize.Value * 0.05f, System.Drawing.Color.Yellow);

                scene.AddRigidMesh(camMesh.Mesh, camNode);
            }

            if (Matrix4x4.Invert(_Camera.Value.AxisMatrix, out var invMatrix))
            {
                // scene.ApplyBasisTransform(invMatrix);
            }
        }
Exemple #2
0
        public void CreateAllAnimationTypesScene()
        {
            // 3D View 7.1908.9012.0 has an issue displaying off-center meshes with animated morph targets.

            TestContext.CurrentContext.AttachGltfValidatorLinks();

            // create two materials

            var pink = new MaterialBuilder("material1")
                       .WithChannelParam(KnownChannel.BaseColor, KnownProperty.RGBA, new Vector4(1, 0, 1, 1));

            var yellow = new MaterialBuilder("material2")
                         .WithChannelParam(KnownChannel.BaseColor, KnownProperty.RGBA, new Vector4(1, 1, 0, 1));

            var mesh1 = VPOSNRM.CreateCompatibleMesh("shape1");

            mesh1.AddCube(pink, Matrix4x4.Identity);

            var mesh2 = VPOSNRM.CreateCompatibleMesh("shape2");

            mesh2.AddCube(yellow, Matrix4x4.Identity);

            var scene = new SceneBuilder();

            var inst1 = scene.AddRigidMesh(mesh1, Matrix4x4.Identity);

            // meshes intended to support animation must be created using an armature
            var armature = new NodeBuilder();

            armature.LocalTransform = Matrix4x4.CreateTranslation(2, 0, 0);
            var inst2 = scene.AddRigidMesh(mesh2, armature);

            scene.AttachToCurrentTest("static.glb");
            scene.AttachToCurrentTest("static.gltf");

            // up to this point, the scene has two plain unanimated cubes.

            var morphBuilder = mesh2.UseMorphTarget(0);

            morphBuilder.SetVertexDelta(morphBuilder.Positions.ElementAt(0), (Vector3.UnitY, Vector3.Zero));
            morphBuilder.SetVertexDelta(morphBuilder.Positions.ElementAt(1), (Vector3.UnitY, Vector3.Zero));
            morphBuilder.SetVertexDelta(morphBuilder.Positions.ElementAt(2), (Vector3.UnitY, Vector3.Zero));
            morphBuilder.SetVertexDelta(morphBuilder.Positions.ElementAt(3), (Vector3.UnitY, Vector3.Zero));

            // set default value.
            inst2.Content.UseMorphing().SetValue(1);

            // ser animation curve.
            var curve = inst2.Content.UseMorphing().UseTrackBuilder("Default");

            curve.SetPoint(0, true, 0);
            curve.SetPoint(1, true, 1);
            curve.SetPoint(2, true, 0);

            var gltf = scene.ToGltf2();

            TestContext.WriteLine(gltf.GetJsonPreview());

            var meshIdx = 1;

            Assert.AreEqual(1, gltf.LogicalMeshes[meshIdx].Primitives[0].MorphTargetsCount);
            Assert.AreEqual(1, gltf.LogicalMeshes[meshIdx].MorphWeights[0]);
            Assert.AreEqual(1, gltf.LogicalAnimations.Count);

            scene.AttachToCurrentTest("mopth.glb");
            scene.AttachToCurrentTest("mopth.gltf");
        }
Exemple #3
0
        public void CreateDoubleSkinnedScene()
        {
            TestContext.CurrentContext.AttachGltfValidatorLinks();

            // create two materials

            var pink = new MaterialBuilder("material1")
                       .WithChannelParam(KnownChannel.BaseColor, KnownProperty.RGBA, new Vector4(1, 0, 1, 1))
                       .WithDoubleSide(true);

            var yellow = new MaterialBuilder("material2")
                         .WithChannelParam(KnownChannel.BaseColor, KnownProperty.RGBA, new Vector4(1, 1, 0, 1))
                         .WithDoubleSide(true);

            // create the mesh

            const int jointIdx0 = 0; // index of joint node 0
            const int jointIdx1 = 1; // index of joint node 1
            const int jointIdx2 = 2; // index of joint node 2

            var v1 = new SKINNEDVERTEX4(new Vector3(-10, 0, +10), (jointIdx0, 1));
            var v2 = new SKINNEDVERTEX4(new Vector3(+10, 0, +10), (jointIdx0, 1));
            var v3 = new SKINNEDVERTEX4(new Vector3(+10, 0, -10), (jointIdx0, 1));
            var v4 = new SKINNEDVERTEX4(new Vector3(-10, 0, -10), (jointIdx0, 1));

            var v5 = new SKINNEDVERTEX4(new Vector3(-10, 40, +10), (jointIdx0, 0.5f), (jointIdx1, 0.5f));
            var v6 = new SKINNEDVERTEX4(new Vector3(+10, 40, +10), (jointIdx0, 0.5f), (jointIdx1, 0.5f));
            var v7 = new SKINNEDVERTEX4(new Vector3(+10, 40, -10), (jointIdx0, 0.5f), (jointIdx1, 0.5f));
            var v8 = new SKINNEDVERTEX4(new Vector3(-10, 40, -10), (jointIdx0, 0.5f), (jointIdx1, 0.5f));

            var v9  = new SKINNEDVERTEX4(new Vector3(-5, 80, +5), (jointIdx2, 1));
            var v10 = new SKINNEDVERTEX4(new Vector3(+5, 80, +5), (jointIdx2, 1));
            var v11 = new SKINNEDVERTEX4(new Vector3(+5, 80, -5), (jointIdx2, 1));
            var v12 = new SKINNEDVERTEX4(new Vector3(-5, 80, -5), (jointIdx2, 1));

            var mesh = SKINNEDVERTEX4.CreateCompatibleMesh("mesh1");

            #if DEBUG
            mesh.VertexPreprocessor.SetValidationPreprocessors();
            #else
            mesh.VertexPreprocessor.SetSanitizerPreprocessors();
            #endif

            mesh.UsePrimitive(pink).AddQuadrangle(v1, v2, v6, v5);
            mesh.UsePrimitive(pink).AddQuadrangle(v2, v3, v7, v6);
            mesh.UsePrimitive(pink).AddQuadrangle(v3, v4, v8, v7);
            mesh.UsePrimitive(pink).AddQuadrangle(v4, v1, v5, v8);

            mesh.UsePrimitive(yellow).AddQuadrangle(v5, v6, v10, v9);
            mesh.UsePrimitive(yellow).AddQuadrangle(v6, v7, v11, v10);
            mesh.UsePrimitive(yellow).AddQuadrangle(v7, v8, v12, v11);
            mesh.UsePrimitive(yellow).AddQuadrangle(v8, v5, v9, v12);

            mesh.Validate();

            // create the skeleton armature 1 for the skinned mesh.

            var armature1 = new NodeBuilder("Skeleton1");
            var joint0    = armature1.CreateNode("Joint 0").WithLocalTranslation(new Vector3(0, 0, 0)); // jointIdx0
            var joint1    = joint0.CreateNode("Joint 1").WithLocalTranslation(new Vector3(0, 40, 0));   // jointIdx1
            var joint2    = joint1.CreateNode("Joint 2").WithLocalTranslation(new Vector3(0, 40, 0));   // jointIdx2

            joint1.UseRotation("Base Track")
            .WithPoint(1, Quaternion.Identity)
            .WithPoint(2, Quaternion.CreateFromYawPitchRoll(0, 1, 0))
            .WithPoint(3, Quaternion.CreateFromYawPitchRoll(0, 0, 1))
            .WithPoint(4, Quaternion.Identity);

            // create the skeleton armature 2 for the skinned mesh.

            var armature2 = new NodeBuilder("Skeleton2").WithLocalTranslation(new Vector3(100, 0, 0));
            var joint3    = armature2.CreateNode("Joint 3").WithLocalTranslation(new Vector3(0, 0, 0)); // jointIdx0
            var joint4    = joint3.CreateNode("Joint 4").WithLocalTranslation(new Vector3(0, 40, 0));   // jointIdx1
            var joint5    = joint4.CreateNode("Joint 5").WithLocalTranslation(new Vector3(0, 40, 0));   // jointIdx2

            joint4.UseRotation("Base Track")
            .WithPoint(1, Quaternion.Identity)
            .WithPoint(2, Quaternion.CreateFromYawPitchRoll(0, 1, 0))
            .WithPoint(3, Quaternion.CreateFromYawPitchRoll(0, 0, 1))
            .WithPoint(4, Quaternion.Identity);

            // create scene

            var scene = new SceneBuilder();

            scene.AddSkinnedMesh
            (
                mesh,
                armature1.WorldMatrix,
                joint0, // joint used for skinning joint index 0
                joint1, // joint used for skinning joint index 1
                joint2  // joint used for skinning joint index 2
            );

            scene.AddSkinnedMesh
            (
                mesh,
                armature2.WorldMatrix,
                joint3, // joint used for skinning joint index 0
                joint4, // joint used for skinning joint index 1
                joint5  // joint used for skinning joint index 2
            );

            scene.AttachToCurrentTest("skinned.glb");
            scene.AttachToCurrentTest("skinned.gltf");
        }
Exemple #4
0
 private NodeBuilder(NodeBuilder parent)
 {
     _Parent = parent;
 }
 public Node GetNode(NodeBuilder key)
 {
     return(key == null ? null : _Nodes.TryGetValue(key, out Node val) ? val : null);
 }
Exemple #6
0
 internal FixedTransformer(Object content, NodeBuilder parentNode, Transforms.AffineTransform childTransform)
     : base(content)
 {
     _ParentNode     = parentNode;
     _ChildTransform = childTransform;
 }
Exemple #7
0
 public TransformChainBuilder(NodeBuilder parent, TRANSFORM child)
 {
     _ParentTransform = parent;
     _ChildTransform  = child;
 }
Exemple #8
0
 public TransformChainBuilder(NodeBuilder node)
 {
     _ParentTransform = node;
     _ChildTransform  = null;
 }