//============================================================ // <T>加载配置信息。</T> // // @param xconfig 配置信息 //============================================================ public void LoadSingleConfig(FXmlNode xconfig) { // 读取设置 if (xconfig.Contains("translation")) { SFloatVector3 translation = new SFloatVector3(); translation.Parse(xconfig.Get("translation")); tx = translation.X; ty = translation.Y; tz = translation.Z; } if (xconfig.Contains("rotation")) { SFloatVector3 rotation = new SFloatVector3(); rotation.Parse(xconfig.Get("rotation")); rx = rotation.X; ry = rotation.Y; rz = rotation.Z; } if (xconfig.Contains("scale")) { SFloatVector3 scale = new SFloatVector3(); scale.Parse(xconfig.Get("scale")); sx = scale.X; sy = scale.Y; sz = scale.Z; } // 更新数据 Update(); }
//============================================================ // <T>向量数乘</T> // // @params value 要相乘的向量 //============================================================ public void Move(SFloatVector3 value, float distince) { tx += distince * value.X; ty += distince * value.Y; tz += distince * value.Z; dirty = true; }
//============================================================ // <T>标准化<T/> //============================================================ public SFloatVector3 Cross(SFloatVector3 value) { value.Normalize(); SFloatVector3 result = new SFloatVector3(); result.X = (Y * value.Z) - (Z * value.Y); result.Y = (Z * value.X) - (X * value.Z); result.Z = (X * value.Y) - (Y * value.X); result.Normalize(); return(result); }
//============================================================ public float Angle(SFloatVector3 value) { // 计算两单位向量点乘 SFloatVector3 value1 = new SFloatVector3(X, Y, Z); value1.Normalize(); SFloatVector3 value2 = new SFloatVector3(value.X, value.Y, value.Z); value2.Normalize(); // 计算夹角 float cos = value1.Dot(value2); return((float)Math.Acos(cos)); }
//============================================================ // <T>反序列化数据信息。</T> // // @param p:input 输入数据流 //============================================================ public void UpdateAll(SFloatPoint3 pt, SFloatVector3 pd, SFloatVector3 ps) { // 读取平移信息 tx = pt.X; ty = pt.Y; tz = pt.Z; // 读取旋转弧度 rx = pd.X; ry = pd.Y; rz = pd.Z; // 读取缩放信息 sx = ps.X; sy = ps.Y; sz = ps.Z; // 更新信息 UpdateForce(); }
//============================================================ // <T>设置平移内容。</T> //============================================================ public void Transform3x3Vector3(SFloatVector3 output, SFloatVector3 input) { output.X = (input.X * data[0]) + (input.Y * data[4]) + (input.Z * data[8]); output.Y = (input.X * data[1]) + (input.Y * data[5]) + (input.Z * data[9]); output.Z = (input.X * data[2]) + (input.Y * data[6]) + (input.Z * data[10]); }
//============================================================ public float Dot(SFloatVector3 value) { return((X * value.X) + (Y * value.Y) + (Z * value.Z)); }
//============================================================ public void Add(SFloatVector3 vector) { X += vector.X; Y += vector.Y; Z += vector.Z; }
//============================================================ public void Assign(SFloatVector3 value) { X = value.X; Y = value.Y; Z = value.Z; }
//============================================================ // <T>标准化<T/> //============================================================ public void Cross(SFloatVector3 value, SFloatVector3 result) { result.X = (Y * value.Z) - (Z * value.Y); result.Y = (Z * value.X) - (X * value.Z); result.Z = (X * value.Y) - (Y * value.X); }