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); }
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); }
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; }
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; }
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] ); }
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] ); }
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())); }
private DAEVector4 GetColor(TargetableFloat3 deaColor) { return(new DAEVector4(deaColor.Values[0], deaColor.Values[1], deaColor.Values[2], 1)); }
public static Matrix4 ScaleToMatrix4(TargetableFloat3 t) { return(Matrix4.CreateScale((float)t.Values[0], (float)t.Values[1], (float)t.Values[2])); }
public static Matrix4 TranslationToMatrix4(TargetableFloat3 t) { return(Matrix4.CreateTranslation((float)t.Values[0], (float)t.Values[1], (float)t.Values[2])); }
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); }