コード例 #1
0
        public static Matrix4 ScaleToMatrix4(this TargetableFloat3 t)
        {
            Matrix4 scale;

            Matrix4.CreateScale((float)t.Values[0], (float)t.Values[1], (float)t.Values[2], out scale);
            return(scale);
        }
コード例 #2
0
        public static Matrix4 TranslationToMatrix4(this TargetableFloat3 t)
        {
            Matrix4 trans;

            Matrix4.CreateTranslation((float)t.Values[0], (float)t.Values[1], (float)t.Values[2], out trans);
            return(trans);
        }
コード例 #3
0
        public static void ApplyScale(TransformMatrix transformMat, TargetableFloat3 scale)
        {
            var scaleMat = Matrix4.CreateScale(
                (float)scale.Values[0],
                (float)scale.Values[1],
                (float)scale.Values[2]
                );

            transformMat.transform = scaleMat * transformMat.transform;
        }
コード例 #4
0
        public static void ApplyTranslation(TransformMatrix transformMat, TargetableFloat3 translation)
        {
            var translationMat = Matrix4.CreateTranslation(
                (float)translation.Values[0],
                (float)translation.Values[1],
                (float)translation.Values[2]
                );

            transformMat.transform = translationMat * transformMat.transform;
        }
コード例 #5
0
ファイル: ColladaHelpers.cs プロジェクト: xenogenesi/lslib
        public static void ApplyScale(TransformMatrix transformMat, TargetableFloat3 scale)
        {
            var transform = transformMat.transform;

            transform.Flags            |= (int)Transform.TransformFlags.HasScaleShear;
            transform.ScaleShear[0, 0] *= (float)scale.Values[0];
            transform.ScaleShear[1, 1] *= (float)scale.Values[1];
            transform.ScaleShear[2, 2] *= (float)scale.Values[2];

            transformMat.matrix *= Matrix4.CreateScale(
                (float)scale.Values[0],
                (float)scale.Values[1],
                (float)scale.Values[2]
                );
        }
コード例 #6
0
ファイル: ColladaHelpers.cs プロジェクト: xenogenesi/lslib
        public static void ApplyTranslation(TransformMatrix transformMat, TargetableFloat3 translation)
        {
            var transform = transformMat.transform;

            transform.Flags         |= (int)Transform.TransformFlags.HasTranslation;
            transform.Translation.X += (float)translation.Values[0];
            transform.Translation.Y += (float)translation.Values[1];
            transform.Translation.Z += (float)translation.Values[2];

            transformMat.matrix *= Matrix4.CreateTranslation(
                (float)translation.Values[0],
                (float)translation.Values[1],
                (float)translation.Values[2]
                );
        }
コード例 #7
0
ファイル: DAENode.cs プロジェクト: Marc56K/Collada14
        internal IDAESceneNode GetSceneNode(DAELoaderNode loader)
        {
            List <IDAESceneNode> children = new List <IDAESceneNode>();

            // load geometry
            if (_node.instance_geometry != null && _node.instance_geometry.Length > 0)
            {
                foreach (var instGeo in _node.instance_geometry)
                {
                    Dictionary <string, string> instanceMaterials = new Dictionary <string, string>();
                    if (instGeo.bind_material != null)
                    {
                        foreach (instance_material instMat in instGeo.bind_material.technique_common)
                        {
                            instanceMaterials.Add(instMat.symbol, instMat.target);
                        }
                    }

                    DAEGeometry          geo    = loader.LibGeometries.GetGeometry(loader, DAEUtils.GetUrl(instGeo.url).Id);
                    List <IDAEShapeNode> shapes = geo.GetShapeNodes(loader, instanceMaterials, _node.name);

                    foreach (IDAEShapeNode shape in shapes)
                    {
                        children.Add(shape);
                    }
                }
            }

            // load lights
            if (_node.instance_light != null && _node.instance_light.Length > 0)
            {
                foreach (var instLight in _node.instance_light)
                {
                    IDAESceneNode lightNode = loader.LibLights.GetLightNode(loader, DAEUtils.GetUrl(instLight.url).Id);
                    if (lightNode != null)
                    {
                        children.Add(lightNode);
                    }
                }
            }

            // load local children
            if (_node.node1 != null && _node.node1.Length > 0)
            {
                foreach (node child in _node.node1)
                {
                    DAENode       n         = new DAENode(child);
                    IDAESceneNode childNode = n.GetSceneNode(loader);
                    if (childNode != null)
                    {
                        children.Add(childNode);
                    }
                }
            }

            // load remote children
            if (_node.instance_node != null)
            {
                foreach (InstanceWithExtra child in _node.instance_node)
                {
                    IDAESceneNode childNode = null;
                    var           url       = DAEUtils.GetUrl(child.url);
                    if (string.IsNullOrEmpty(url.FilePath))
                    {
                        childNode = loader.LibNodes.GetSceneNode(loader, url.Id);
                    }
                    else
                    {
                        var extLoader = loader.GetLoaderForUrl(url);
                        childNode = extLoader.GetSceneGraph(); //TODO only load node with url.Id
                    }
                    if (childNode != null)
                    {
                        children.Add(childNode);
                    }
                }
            }

            // load transformation
            DAEMatrix4 finalTrans = DAEMatrix4.Identity;

            if (_node.Items != null)
            {
                for (int i = 0; i < _node.Items.Length; i++)
                {
                    object           trans     = _node.Items[i];
                    ItemsChoiceType2 transType = _node.ItemsElementName[i];

                    if (transType == ItemsChoiceType2.matrix)
                    {
                        matrix     m = trans as matrix;
                        DAEMatrix4 k = DAEMatrix4.Identity;
                        k.M11       = m.Values[0];
                        k.M12       = m.Values[1];
                        k.M13       = m.Values[2];
                        k.M14       = m.Values[3];
                        k.M21       = m.Values[4];
                        k.M22       = m.Values[5];
                        k.M23       = m.Values[6];
                        k.M24       = m.Values[7];
                        k.M31       = m.Values[8];
                        k.M32       = m.Values[9];
                        k.M33       = m.Values[10];
                        k.M34       = m.Values[11];
                        k.M41       = m.Values[12];
                        k.M42       = m.Values[13];
                        k.M43       = m.Values[14];
                        k.M44       = m.Values[15];
                        finalTrans *= k;
                    }
                    else if (transType == ItemsChoiceType2.rotate)
                    {
                        rotate r = trans as rotate;
                        finalTrans *= DAEMatrix4.Rotation(r.Values[0], r.Values[1], r.Values[2], (r.Values[3] * System.Math.PI / 180));
                    }
                    else if (transType == ItemsChoiceType2.lookat)
                    {
                        //lookat l = trans as lookat;
                        //finalTrans *= SharpDX.Matrix.LookAtLH(
                        //    new SharpDX.Vector3((float)l.Values[0], (float)l.Values[1], (float)l.Values[2]),
                        //    new SharpDX.Vector3((float)l.Values[3], (float)l.Values[4], (float)l.Values[5]),
                        //    new SharpDX.Vector3((float)l.Values[6], (float)l.Values[7], (float)l.Values[8]));

                        // not implemented
                    }
                    else if (transType == ItemsChoiceType2.scale)
                    {
                        TargetableFloat3 s = trans as TargetableFloat3;
                        finalTrans *= DAEMatrix4.Scaling(s.Values[0], s.Values[1], s.Values[2]);
                    }
                    else if (transType == ItemsChoiceType2.translate)
                    {
                        TargetableFloat3 t = trans as TargetableFloat3;
                        finalTrans *= DAEMatrix4.Translation(t.Values[0], t.Values[1], t.Values[2]);
                    }
                    else if (transType == ItemsChoiceType2.skew)
                    {
                        // not implemented
                    }
                }
            }

            return(loader.Context.CreateGroupNode(_node.name, finalTrans, children.ToArray()));
        }
コード例 #8
0
ファイル: DAELibraryLights.cs プロジェクト: Marc56K/Collada14
 private DAEVector4 GetColor(TargetableFloat3 deaColor)
 {
     return(new DAEVector4(deaColor.Values[0], deaColor.Values[1], deaColor.Values[2], 1));
 }
コード例 #9
0
 public static Matrix4 ScaleToMatrix4(TargetableFloat3 t)
 {
     return(Matrix4.CreateScale((float)t.Values[0], (float)t.Values[1], (float)t.Values[2]));
 }
コード例 #10
0
 public static Matrix4 TranslationToMatrix4(TargetableFloat3 t)
 {
     return(Matrix4.CreateTranslation((float)t.Values[0], (float)t.Values[1], (float)t.Values[2]));
 }
コード例 #11
0
ファイル: Skeleton.cs プロジェクト: xenogenesi/lslib
        public node MakeCollada(string parentName)
        {
            var node = new node();

            node.id   = "Bone_" + Name.Replace(' ', '_');
            node.name = Name; // .Replace(' ', '_');
            node.sid  = Name.Replace(' ', '_');
            node.type = NodeType.JOINT;

            var transforms     = new List <object>();
            var transformTypes = new List <ItemsChoiceType2>();

            if (false) // Separate transforms
            {
                var rotationX = new rotate();
                rotationX.sid = "RotateX";
                transforms.Add(rotationX);
                transformTypes.Add(ItemsChoiceType2.rotate);

                var rotationY = new rotate();
                rotationY.sid = "RotateY";
                transforms.Add(rotationY);
                transformTypes.Add(ItemsChoiceType2.rotate);

                var rotationZ = new rotate();
                rotationZ.sid = "RotateZ";
                transforms.Add(rotationZ);
                transformTypes.Add(ItemsChoiceType2.rotate);

                if ((Transform.Flags & (uint)Transform.TransformFlags.HasRotation) != 0)
                {
                    var rot = Transform.Rotation.Normalized();
                    //var x = Math.Atan2(2 * (rot.W * rot.X + rot.Y * rot.Z), 1 - 2 * (rot.X * rot.X + rot.Y * rot.Y));
                    //var y = Math.Asin(2 * (rot.W * rot.Y - rot.X * rot.Z));
                    //var z = Math.Atan2(2 * (rot.W * rot.Z + rot.X * rot.Y), 1 - 2 * (rot.Y * rot.Y + rot.Z * rot.Z));

                    //var x = Math.Atan2(2 * rot.Y * rot.W - 2 * rot.X * rot.Z, 1 - 2 * (rot.Y * rot.Y + rot.Z * rot.Z));
                    //var y = Math.Asin(2 * (rot.X * rot.Y + rot.Z * rot.W));
                    //var z = Math.Atan2(2 * rot.X * rot.W - 2 * rot.Y * rot.Z, 1 - 2 * (rot.X * rot.X + rot.Z * rot.Z));
                    var q = new float[] { rot.X, rot.Y, rot.Z, rot.W };

                    // sedris z-y-x

                    /*var x = Math.Atan2(q[2] * q[3] + q[0] * q[1], 0.5f - (q[1] * q[1] + q[2] * q[2]));
                    *  var y = Math.Asin(-2 * (q[1] * q[3] - q[0] * q[2]));
                    *  var z = Math.Atan2(q[1] * q[2] + q[0] * q[3], 0.5f - (q[2] * q[2] + q[3] * q[3]));*/

                    var sqw = rot.W * rot.W;
                    var sqx = rot.X * rot.X;
                    var sqy = rot.Y * rot.Y;
                    var sqz = rot.Z * rot.Z;
                    var x   = Math.Atan2(2.0 * (rot.X * rot.Y + rot.Z * rot.W), (sqx - sqy - sqz + sqw));
                    var z   = Math.Atan2(2.0 * (rot.Y * rot.Z + rot.X * rot.W), (-sqx - sqy + sqz + sqw));
                    var y   = Math.Asin(-2.0 * (rot.X * rot.Z - rot.Y * rot.W) / (sqx + sqy + sqz + sqw));

                    rotationX.Values = new double[] { 1.0, 0.0, 0.0, x * 180 / Math.PI };
                    rotationY.Values = new double[] { 0.0, 1.0, 0.0, y * 180 / Math.PI };
                    rotationZ.Values = new double[] { 0.0, 0.0, 1.0, z * 180 / Math.PI };

                    var axisAngle = Transform.Rotation.ToAxisAngle();
                    //rotation.Values = new double[] { axisAngle.X, axisAngle.Y, axisAngle.Z, axisAngle.W * 180 / Math.PI };
                    //rotationX.Values = new double[] { axisAngle.X, 0.0, 0.0, axisAngle.W * 180 / Math.PI };
                    //rotationY.Values = new double[] { 0.0, axisAngle.Y, 0.0, axisAngle.W * 180 / Math.PI };
                    //rotationZ.Values = new double[] { 0.0, 0.0, axisAngle.Z, axisAngle.W * 180 / Math.PI };

                    /*rotationX.Values = new double[] { 1.0, 0.0, 0.0, axisAngle.X * axisAngle.W * 180 / Math.PI };
                    *  rotationY.Values = new double[] { 0.0, 1.0, 0.0, axisAngle.Y * axisAngle.W * 180 / Math.PI };
                    *  rotationZ.Values = new double[] { 0.0, 0.0, 1.0, axisAngle.Z * axisAngle.W * 180 / Math.PI };*/
                }
                else
                {
                    rotationX.Values = new double[] { 1.0, 0.0, 0.0, 0.0 };
                    rotationY.Values = new double[] { 0.0, 0.0, 0.0, 0.0 };
                    rotationZ.Values = new double[] { 0.0, 0.0, 0.0, 0.0 };
                }

                var scale = new TargetableFloat3();
                scale.sid = "Scale";
                transforms.Add(scale);
                transformTypes.Add(ItemsChoiceType2.scale);

                if ((Transform.Flags & (uint)Transform.TransformFlags.HasScaleShear) != 0)
                {
                    var scaleShear = Transform.ScaleShear.Diagonal;
                    scale.Values = new double[] { scaleShear.X, scaleShear.Y, scaleShear.Z };
                }
                else
                {
                    scale.Values = new double[] { 1.0, 1.0, 1.0 };
                }

                var translate = new TargetableFloat3();
                translate.sid = "Translate";
                transforms.Add(translate);
                transformTypes.Add(ItemsChoiceType2.translate);

                if ((Transform.Flags & (uint)Transform.TransformFlags.HasTranslation) != 0)
                {
                    var transVec = Transform.Translation;
                    translate.Values = new double[] { transVec.X, transVec.Y, transVec.Z };
                }
                else
                {
                    translate.Values = new double[] { 0.0, 0.0, 0.0 };
                }
            }
            else
            {
                var transform = new matrix();
                transform.sid = "Transform";
                var mat = Transform.ToMatrix4();
                mat.Transpose();
                transform.Values = new double[] {
                    mat[0, 0], mat[0, 1], mat[0, 2], mat[0, 3],
                    mat[1, 0], mat[1, 1], mat[1, 2], mat[1, 3],
                    mat[2, 0], mat[2, 1], mat[2, 2], mat[2, 3],
                    mat[3, 0], mat[3, 1], mat[3, 2], mat[3, 3]
                };
                transforms.Add(transform);
                transformTypes.Add(ItemsChoiceType2.matrix);
            }

            node.Items            = transforms.ToArray();
            node.ItemsElementName = transformTypes.ToArray();
            return(node);
        }