private IEnumerable <TrackComplexModelEntry> LoadModels() { var directory = Path.GetDirectoryName(_modelsIniFilename) ?? ""; return(from section in new IniFile(_modelsIniFilename).GetSections("MODEL") let rot = section.GetSlimVector3("ROTATION") select new TrackComplexModelEntry { Kn5 = Kn5.FromFile(Path.Combine(directory, section.GetNonEmpty("FILE") ?? "")), Matrix = Matrix.Translation(section.GetSlimVector3("POSITION")) * Matrix.RotationYawPitchRoll(rot.X, rot.Y, rot.Z), }); }
/// <summary> /// Возвращает матрицу в системе координат DirectX /// </summary> /// <param name="frame">Фрейм</param> /// <returns></returns> public static Matrix ToDirectXMatrix(this Frame3D frame) { //Если нет кватерниона - поворачиваем исходя из Pitch, yaw, roll - иначе через кватернион. if (!frame.Orientation.HasValue) { return(Matrix.RotationYawPitchRoll((float)frame.Pitch.Radian, (float)frame.Roll.Radian, -(float)frame.Yaw.Radian) * Matrix.Translation(-(float)frame.X, (float)frame.Y, (float)frame.Z)); } Quat quat = frame.Orientation.Value; var q = new Quaternion((float)quat.X, (float)quat.Y, (float)quat.Z, (float)quat.W); return(Matrix.RotationQuaternion(q) * Matrix.Translation(-(float)frame.X, (float)frame.Y, (float)frame.Z)); }