public bool AddPoint(OpenTK.Vector3d vec, double eps) { if (eps <= 0) { return(false); } if (IsntEmpty) { MinX = (MinX < vec.X - eps) ? MinX : vec.X - eps; MinY = (MinY < vec.Y - eps) ? MinY : vec.Y - eps; MinZ = (MinZ < vec.Z - eps) ? MinZ : vec.Z - eps; MaxX = (MaxX > vec.X + eps) ? MaxX : vec.X + eps; MaxY = (MaxY > vec.Y + eps) ? MaxY : vec.Y + eps; MaxZ = (MaxZ > vec.Z + eps) ? MaxZ : vec.Z + eps; } else { IsntEmpty = true; MinX = vec.X - eps; MinY = vec.Y - eps; MinZ = vec.Z - eps; MaxX = vec.X + eps; MaxY = vec.Y + eps; MaxZ = vec.Z + eps; } return(true); }
public static void SetModelViewTransform(Camera camera) { //System.Diagnostics.Debug.WriteLine("SetModelViewTransform"); { // pan the object double x; double y; double z; camera.GetCenterPosition(out x, out y, out z); //System.Diagnostics.Debug.WriteLine("CenterPosition = " + x + ", " + y + ", " + z); GL.Translate(x, y, z); } { // rotate OpenTK.Matrix4d rot = camera.RotMatrix44(); GL.MultMatrix(ref rot); } { // put the origin at the center of object double x; double y; double z; OpenTK.Vector3d objCenter = camera.ObjectCenter; x = objCenter.X; y = objCenter.Y; z = objCenter.Z; //System.Diagnostics.Debug.WriteLine("objCenter = " + x + ", " + y + ", " + z); GL.Translate(-x, -y, -z); } }
public void calculDistanceFromCurrent() { EDSystem _oSys = EDDatas.Instance.getCurrentSystem(); OpenTK.Vector3d o = new OpenTK.Vector3d(_oSys.x, _oSys.y, _oSys.z); OpenTK.Vector3d d = new OpenTK.Vector3d(x, y, z); m_distanceFromCurrentSystem = Math.Round(OpenTK.Vector3d.Distance(o, d), 2); }
private void MakeNormal() { uint ptCnt = VertexArray.PointCount; if (NormalArray == null) { NormalArray = new double[ptCnt * 3]; } for (int i = 0; i < 3 * ptCnt; i++) { NormalArray[i] = 0; } for (int idp = 0; idp < DrawParts.Count; idp++) { FaceFieldDrawPart dp = DrawParts[idp]; uint elemCnt = dp.ElemCount; for (int iElem = 0; iElem < elemCnt; iElem++) { uint[] vertexs = dp.GetVertexs((uint)iElem); OpenTK.Vector3d c0 = new OpenTK.Vector3d( VertexArray.VertexCoordArray[vertexs[0] * 3], VertexArray.VertexCoordArray[vertexs[0] * 3 + 1], VertexArray.VertexCoordArray[vertexs[0] * 3 + 2]); OpenTK.Vector3d c1 = new OpenTK.Vector3d( VertexArray.VertexCoordArray[vertexs[1] * 3], VertexArray.VertexCoordArray[vertexs[1] * 3 + 1], VertexArray.VertexCoordArray[vertexs[1] * 3 + 2]); OpenTK.Vector3d c2 = new OpenTK.Vector3d( VertexArray.VertexCoordArray[vertexs[2] * 3], VertexArray.VertexCoordArray[vertexs[2] * 3 + 1], VertexArray.VertexCoordArray[vertexs[2] * 3 + 2]); double[] n; double area; CadUtils.UnitNormalAreaTri3D(out n, out area, c0, c1, c2); NormalArray[vertexs[0] * 3 + 0] += n[0]; NormalArray[vertexs[0] * 3 + 1] += n[1]; NormalArray[vertexs[0] * 3 + 2] += n[2]; NormalArray[vertexs[1] * 3 + 0] += n[0]; NormalArray[vertexs[1] * 3 + 1] += n[1]; NormalArray[vertexs[1] * 3 + 2] += n[2]; NormalArray[vertexs[2] * 3 + 0] += n[0]; NormalArray[vertexs[2] * 3 + 1] += n[1]; NormalArray[vertexs[2] * 3 + 2] += n[2]; } } for (int iPt = 0; iPt < ptCnt; iPt++) { double[] p = new double[3]; p[0] = NormalArray[iPt * 3]; p[1] = NormalArray[iPt * 3 + 1]; p[2] = NormalArray[iPt * 3 + 2]; double invLen = 1.0 / Math.Sqrt(p[0] * p[0] + p[1] * p[1] + p[2] * p[2]); NormalArray[0] *= invLen; NormalArray[1] *= invLen; NormalArray[2] *= invLen; } }
// ECEF: earth-centered, earth-fixed public void LocationEnuPositionTest() { // 52.341362, 4.912569 var myposition = new OpenTK.Vector3d(52.341362, 4.912569, 0); var enu = locationPK.EnuPosition(myposition); Assert.IsTrue(enu.X == 0.41312640806427225); Assert.IsTrue(enu.Y == -42.097533230204135); Assert.IsTrue(enu.Z == -6391527.4270682726); }
public static V3d Average(IEnumerable <V3d> vectors) { var average = new V3d(0, 0, 0); foreach (var v in vectors) { average += v; } return(average / vectors.Count()); }
public void SetObjectBoundingBox(BoundingBox3D bb) { ObjectCenter = new OpenTK.Vector3d( ((bb.MinX + bb.MaxX) * 0.5), ((bb.MinY + bb.MaxY) * 0.5), ((bb.MinZ + bb.MaxZ) * 0.5) ); ObjectW = bb.MaxX - bb.MinX; ObjectH = bb.MaxY - bb.MinY; ObjectD = bb.MaxZ - bb.MinZ; }
public bool IsInside(OpenTK.Vector3d vec) { if (!IsntEmpty) { return(false); } if (vec.X >= MinX && vec.X <= MaxX && vec.Y >= MinY && vec.Y <= MaxY && vec.Z >= MinZ && vec.Z <= MaxZ) { return(true); } return(false); }
public static void UnitNormalAreaTri3D(out double[] n, out double a, OpenTK.Vector3d v1, OpenTK.Vector3d v2, OpenTK.Vector3d v3) { n = new double[3]; n[0] = (v2.Y - v1.Y) * (v3.Z - v1.Z) - (v3.Y - v1.Y) * (v2.Z - v1.Z); n[1] = (v2.Z - v1.Z) * (v3.X - v1.X) - (v3.Z - v1.Z) * (v2.X - v1.X); n[2] = (v2.X - v1.X) * (v3.Y - v1.Y) - (v3.X - v1.X) * (v2.Y - v1.Y); a = Math.Sqrt(n[0] * n[0] + n[1] * n[1] + n[2] * n[2]) * 0.5; double invA = 0.5 / a; n[0] *= invA; n[1] *= invA; n[2] *= invA; }
public bool IsPossibilityIntersectSphere(OpenTK.Vector3d vec, double radius) { if (!IsntEmpty) { return(false); } if (vec.X < MinX - radius || vec.X > MaxX + radius || vec.Y < MinY - radius || vec.Y > MaxY + radius || vec.Z < MinZ - radius || vec.Z > MaxZ + radius) { return(false); } // 干渉しないやつが含まれているが、アバウトなままでよい return(true); }
void LookAt(double eyeX,double eyeY,double eyeZ,double centerX,double centerY,double centerZ,double upX,double upY,double upZ) { OpenTK.Vector3d F = new OpenTK.Vector3d(centerX - eyeX, centerX - eyeY, centerZ - eyeZ); OpenTK.Vector3d UP = new OpenTK.Vector3d(upX, upY, upZ); F.Normalize(); UP.Normalize(); OpenTK.Vector3d s = new OpenTK.Vector3d(F.Y * UP.Z - F.Z * UP.Y, F.Z * UP.X - F.X * UP.Z, F.X * UP.Y - F.Y * UP.X); OpenTK.Vector3d u = new OpenTK.Vector3d(s.Y * F.Z - s.Z * F.Y, s.Z * F.X - s.X * F.Z, s.X * F.Y - s.Y * F.X); OpenTK.Matrix4d m = new OpenTK.Matrix4d(s.X, s.Y, s.Z, 0, u.X, u.Y, u.Z, 0, -F.X, -F.Y, -F.Z, 0, 0, 0, 0, 1); GL.MultMatrix(ref m); GL.Translate(-eyeX, -eyeY, -eyeZ); }
/// <summary> /// Z軸(001)を引数のベクトルvに回転させる行列を生成する /// </summary> /// <param name="v"></param> /// <returns></returns> public static M3d CreateRotationFromZ(V3d v) { v.Normalize(); if (Math.Abs(v.Z - 1) < Th) { return(M3d.Identity); } else if (Math.Abs(v.Z + 1) < Th) { return(M3d.CreateRotationX(Math.PI)); } else { return(M3d.CreateFromAxisAngle(V3d.Cross(v, Z), V3d.CalculateAngle(Z, v))); } }
/// <summary> /// Z軸(001)を引数のベクトルvに回転させる行列を生成する /// </summary> /// <param name="v"></param> /// <returns></returns> public static M3d CreateRotationToZ(V3d v) { M3d rot; v.Normalize(); if (Math.Abs(v.Z - 1) < Th) { rot = M3d.Identity; } else if (Math.Abs(v.Z + 1) < Th) { rot = M3d.CreateRotationX(Math.PI); } else { rot = M3d.CreateFromAxisAngle(V3d.Cross(Z, v), V3d.CalculateAngle(Z, v)); } return(rot); }
/// <summary> /// 平面上に分布する点集合が与えられたとき、その点集合が作る多角形の情報を返す /// 1. 頂点index (originから見て反時計回り) /// 2. 法線ベクトル /// 3. 中心座標 /// </summary> /// <param name="points"></param> /// <returns></returns> public static (int[] Indices, V3d Center, V3d Norm) PolygonInfo(IEnumerable <V3d> points, V3d origin) { var center = new V3d(points.Average(p => p.X), points.Average(p => p.Y), points.Average(p => p.Z)); var prm = Geometriy.GetPlaneEquationFromPoints(points.Select(p => p.ToVector3DBase())); var norm = new V3d(prm[0], prm[1], prm[2]); if (V3d.Dot(norm, (center - origin)) < 0) { norm = -norm; } //座標変換 (XY平面に投影) var rot = CreateRotationToZ(norm); var vXY = points.Select(p => p - center).Select(p => new V2d(rot.M11 * p.X + rot.M12 * p.Y + rot.M13 * p.Z, rot.M21 * p.X + rot.M22 * p.Y + rot.M23 * p.Z)).ToList(); int i = vXY.FindIndex(p => p.LengthSquared == vXY.Max(q => q.LengthSquared));//原点から最も距離の遠い点を選ぶ //もう一つ点を選び、直線の方程式を産出 List <int> iList = new List <int>(new[] { i }); do { for (int j = 0; j < vXY.Count; j++) { if (j != i) { var V = new V2d(vXY[j].Y - vXY[i].Y, vXY[i].X - vXY[j].X); var c = vXY[j].X * vXY[i].Y - vXY[i].X * vXY[j].Y; if (vXY.All(p => V2d.Dot(p, V) + c <= Th)) { iList.Add(j); i = j; break; } } } } while (i != iList[0]); return(iList.ToArray(), center, norm); }
public void ProjectOnLine(out double minR, out double maxR, OpenTK.Vector3d org, OpenTK.Vector3d dir) { double[] d = new double[8] { OpenTK.Vector3d.Dot(dir, new OpenTK.Vector3d(MinX, MinY, MinZ) - org), OpenTK.Vector3d.Dot(dir, new OpenTK.Vector3d(MaxX, MinY, MinZ) - org), OpenTK.Vector3d.Dot(dir, new OpenTK.Vector3d(MinX, MaxY, MinZ) - org), OpenTK.Vector3d.Dot(dir, new OpenTK.Vector3d(MaxX, MaxY, MinZ) - org), OpenTK.Vector3d.Dot(dir, new OpenTK.Vector3d(MinX, MinY, MaxZ) - org), OpenTK.Vector3d.Dot(dir, new OpenTK.Vector3d(MaxX, MinY, MaxZ) - org), OpenTK.Vector3d.Dot(dir, new OpenTK.Vector3d(MinX, MaxY, MaxZ) - org), OpenTK.Vector3d.Dot(dir, new OpenTK.Vector3d(MaxX, MaxY, MaxZ) - org) }; minR = d[0]; maxR = d[0]; for (uint i = 1; i < 8; i++) { minR = (d[i] < minR) ? d[i] : minR; maxR = (d[i] > maxR) ? d[i] : maxR; } }
public void ClearActors() { Actors = new List <ZActor>(); CenterPoint = new OpenTK.Vector3d(); }
private void WriteSceneCollision() { /* Fix scene header */ Helpers.Overwrite32(ref SceneData, CmdCollisionOffset + 4, (uint)(0x02000000 | SceneData.Count)); /* Determine collision's minimum/maximum coordinates... */ OpenTK.Vector3d MinCoordinate = new OpenTK.Vector3d(0, 0, 0); OpenTK.Vector3d MaxCoordinate = new OpenTK.Vector3d(0, 0, 0); foreach (ObjFile.Vertex Vtx in ColModel.Vertices) { /* Minimum... */ MinCoordinate.X = Math.Min(MinCoordinate.X, Vtx.X * Scale); MinCoordinate.Y = Math.Min(MinCoordinate.Y, Vtx.Y * Scale); MinCoordinate.Z = Math.Min(MinCoordinate.Z, Vtx.Z * Scale); /* Maximum... */ MaxCoordinate.X = Math.Max(MaxCoordinate.X, Vtx.X * Scale); MaxCoordinate.Y = Math.Max(MaxCoordinate.Y, Vtx.Y * Scale); MaxCoordinate.Z = Math.Max(MaxCoordinate.Z, Vtx.Z * Scale); } /* Prepare variables */ int CmdVertexArray = -1, CmdPolygonArray = -1, CmdPolygonTypes = -1, CmdWaterBoxes = -1; int VertexArrayOffset = -1, PolygonArrayOffset = -1, PolygonTypesOffset = -1, WaterBoxesOffset = -1; /* Write collision header */ Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MinCoordinate.X)); /* Absolute minimum X/Y/Z */ Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MinCoordinate.Y)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MinCoordinate.Z)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MaxCoordinate.X)); /* Absolute maximum X/Y/Z */ Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MaxCoordinate.Y)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MaxCoordinate.Z)); CmdVertexArray = SceneData.Count; Helpers.Append32(ref SceneData, 0x00000000); /* Vertex count */ Helpers.Append32(ref SceneData, 0x00000000); /* Vertex array offset */ CmdPolygonArray = SceneData.Count; Helpers.Append32(ref SceneData, 0x00000000); /* Polygon count */ Helpers.Append32(ref SceneData, 0x00000000); /* Polygon array offset */ CmdPolygonTypes = SceneData.Count; Helpers.Append32(ref SceneData, 0x00000000); /* Polygon type offset */ Helpers.Append32(ref SceneData, 0x00000000); /* Camera data offset (NULL) */ CmdWaterBoxes = SceneData.Count; Helpers.Append32(ref SceneData, 0x00000000); /* Waterbox count */ Helpers.Append32(ref SceneData, 0x00000000); /* Waterbox offset */ AddPadding(ref SceneData, 8); /* Write vertex array & fix command */ VertexArrayOffset = SceneData.Count; foreach (ObjFile.Vertex Vtx in ColModel.Vertices) { Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(Vtx.X * Scale)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(Vtx.Y * Scale)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(Vtx.Z * Scale)); } Helpers.Overwrite32(ref SceneData, CmdVertexArray, (uint)(ColModel.Vertices.Count << 16)); Helpers.Overwrite32(ref SceneData, CmdVertexArray + 4, (uint)(0x02000000 | VertexArrayOffset)); AddPadding(ref SceneData, 8); /* Write polygon array & fix command */ PolygonArrayOffset = SceneData.Count; int TriangleTotal = 0; foreach (ObjFile.Group Group in ColModel.Groups) { foreach (ObjFile.Triangle Tri in Group.Triangles) { Helpers.Append16(ref SceneData, (ushort)Group.PolyType); /* Polygon type */ Helpers.Append16(ref SceneData, (ushort)Tri.VertIndex[0]); /* Index of vertex 1 */ Helpers.Append16(ref SceneData, (ushort)Tri.VertIndex[1]); /* Index of vertex 2 */ Helpers.Append16(ref SceneData, (ushort)Tri.VertIndex[2]); /* Index of vertex 3 */ Helpers.Append16(ref SceneData, 0x7FFF); /* Collision normals X/Y/Z */ Helpers.Append16(ref SceneData, 0x7FFF); Helpers.Append16(ref SceneData, 0x7FFF); Helpers.Append16(ref SceneData, 0x0000); /* Distance from origin */ } TriangleTotal += Group.Triangles.Count; } Helpers.Overwrite32(ref SceneData, CmdPolygonArray, (uint)(TriangleTotal << 16)); Helpers.Overwrite32(ref SceneData, CmdPolygonArray + 4, (uint)(0x02000000 | PolygonArrayOffset)); FixCollision(ref SceneData, VertexArrayOffset, PolygonArrayOffset, TriangleTotal); AddPadding(ref SceneData, 8); /* Write polygon types & fix command */ PolygonTypesOffset = SceneData.Count; foreach (ZColPolyType PT in PolyTypes) { Helpers.Append64(ref SceneData, PT.Raw); } Helpers.Overwrite32(ref SceneData, CmdPolygonTypes, (uint)(0x02000000 | PolygonTypesOffset)); AddPadding(ref SceneData, 8); /* Write waterboxes & fix command */ WaterBoxesOffset = SceneData.Count; foreach (ZWaterbox WBox in Waterboxes) { Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.XPos)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.YPos)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.ZPos)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.XSize)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.ZSize)); Helpers.Append16(ref SceneData, 0x0000); Helpers.Append32(ref SceneData, WBox.Properties); } Helpers.Overwrite32(ref SceneData, CmdWaterBoxes, (uint)(Waterboxes.Count << 16)); Helpers.Overwrite32(ref SceneData, CmdWaterBoxes + 4, (uint)(0x02000000 | WaterBoxesOffset)); /* Padding for good measure */ AddPadding(ref SceneData, 0x800); }
private void WriteSceneCollision() { /* Fix scene header */ Helpers.Overwrite32(ref SceneData, CmdCollisionOffset + 4, (uint)(0x02000000 | SceneData.Count)); /* Determine collision's minimum/maximum coordinates... */ OpenTK.Vector3d MinCoordinate = new OpenTK.Vector3d(0, 0, 0); OpenTK.Vector3d MaxCoordinate = new OpenTK.Vector3d(0, 0, 0); foreach (ObjFile.Vertex Vtx in ColModel.Vertices) { /* Minimum... */ MinCoordinate.X = Math.Min(MinCoordinate.X, Vtx.X * Scale); MinCoordinate.Y = Math.Min(MinCoordinate.Y, Vtx.Y * Scale); MinCoordinate.Z = Math.Min(MinCoordinate.Z, Vtx.Z * Scale); /* Maximum... */ MaxCoordinate.X = Math.Max(MaxCoordinate.X, Vtx.X * Scale); MaxCoordinate.Y = Math.Max(MaxCoordinate.Y, Vtx.Y * Scale); MaxCoordinate.Z = Math.Max(MaxCoordinate.Z, Vtx.Z * Scale); } /* Prepare variables */ int CmdVertexArray = -1, CmdPolygonArray = -1, CmdPolygonTypes = -1, CmdWaterBoxes = -1; int VertexArrayOffset = -1, PolygonArrayOffset = -1, PolygonTypesOffset = -1, WaterBoxesOffset = -1; /* Write collision header */ Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MinCoordinate.X)); /* Absolute minimum X/Y/Z */ Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MinCoordinate.Y)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MinCoordinate.Z)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MaxCoordinate.X)); /* Absolute maximum X/Y/Z */ Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MaxCoordinate.Y)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MaxCoordinate.Z)); CmdVertexArray = SceneData.Count; Helpers.Append32(ref SceneData, 0x00000000); /* Vertex count */ Helpers.Append32(ref SceneData, 0x00000000); /* Vertex array offset */ CmdPolygonArray = SceneData.Count; Helpers.Append32(ref SceneData, 0x00000000); /* Polygon count */ Helpers.Append32(ref SceneData, 0x00000000); /* Polygon array offset */ CmdPolygonTypes = SceneData.Count; Helpers.Append32(ref SceneData, 0x00000000); /* Polygon type offset */ Helpers.Append32(ref SceneData, 0x00000000); /* Camera data offset (NULL) */ CmdWaterBoxes = SceneData.Count; Helpers.Append32(ref SceneData, 0x00000000); /* Waterbox count */ Helpers.Append32(ref SceneData, 0x00000000); /* Waterbox offset */ AddPadding(ref SceneData, 8); /* Write vertex array & fix command */ VertexArrayOffset = SceneData.Count; foreach (ObjFile.Vertex Vtx in ColModel.Vertices) { Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(Vtx.X * Scale)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(Vtx.Y * Scale)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(Vtx.Z * Scale)); } Helpers.Overwrite32(ref SceneData, CmdVertexArray, (uint)(ColModel.Vertices.Count << 16)); Helpers.Overwrite32(ref SceneData, CmdVertexArray + 4, (uint)(0x02000000 | VertexArrayOffset)); AddPadding(ref SceneData, 8); /* Write polygon array & fix command */ PolygonArrayOffset = SceneData.Count; int TriangleTotal = 0; foreach (ObjFile.Group Group in ColModel.Groups) { foreach (ObjFile.Triangle Tri in Group.Triangles) { Helpers.Append16(ref SceneData, (ushort)Group.PolyType); /* Polygon type */ Helpers.Append16(ref SceneData, (ushort)Tri.VertIndex[0]); /* Index of vertex 1 */ Helpers.Append16(ref SceneData, (ushort)Tri.VertIndex[1]); /* Index of vertex 2 */ Helpers.Append16(ref SceneData, (ushort)Tri.VertIndex[2]); /* Index of vertex 3 */ Helpers.Append16(ref SceneData, 0x7FFF); /* Collision normals X/Y/Z */ Helpers.Append16(ref SceneData, 0x7FFF); Helpers.Append16(ref SceneData, 0x7FFF); Helpers.Append16(ref SceneData, 0x0000); /* Distance from origin */ } TriangleTotal += Group.Triangles.Count; } Helpers.Overwrite32(ref SceneData, CmdPolygonArray, (uint)(TriangleTotal << 16)); Helpers.Overwrite32(ref SceneData, CmdPolygonArray + 4, (uint)(0x02000000 | PolygonArrayOffset)); FixCollision(ref SceneData, VertexArrayOffset, PolygonArrayOffset, TriangleTotal); AddPadding(ref SceneData, 8); /* Write polygon types & fix command */ PolygonTypesOffset = SceneData.Count; foreach (ZColPolyType PT in PolyTypes) Helpers.Append64(ref SceneData, PT.Raw); Helpers.Overwrite32(ref SceneData, CmdPolygonTypes, (uint)(0x02000000 | PolygonTypesOffset)); AddPadding(ref SceneData, 8); /* Write waterboxes & fix command */ WaterBoxesOffset = SceneData.Count; foreach (ZWaterbox WBox in Waterboxes) { Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.XPos)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.YPos)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.ZPos)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.XSize)); Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.ZSize)); Helpers.Append16(ref SceneData, 0x0000); Helpers.Append32(ref SceneData, WBox.Properties); } Helpers.Overwrite32(ref SceneData, CmdWaterBoxes, (uint)(Waterboxes.Count << 16)); Helpers.Overwrite32(ref SceneData, CmdWaterBoxes + 4, (uint)(0x02000000 | WaterBoxesOffset)); /* Padding for good measure */ AddPadding(ref SceneData, 0x800); }
public void ClearActors() { Actors = new List<ZActor>(); CenterPoint = new OpenTK.Vector3d(); }
/// <summary> /// 拡張メソッド. /// </summary> /// <param name="v"></param> /// <returns></returns> public static V3f ToV3f(this V3d v) => new V3f((float)v.X, (float)v.Y, (float)v.Z);
private static Vector3D Lerp(Vector3D v0, Vector3D v1, double t) { return((1 - t) * v0 + t * v1); }
/// <summary> /// 拡張メソッド. /// </summary> /// <param name="v"></param> /// <returns></returns> public static V4d ToV4d(this V3d v) => new V4d(v.X, v.Y, v.Z, 1);
public Coord(Vec3d pos, Quatd rot) { Position = pos; Rotation = rot; }
private static double GetMaxComponent(this Vector3D color) { return(Math.Max(color.X, Math.Max(color.Y, color.Z))); }
private static double GetPerceivedBrightness(this Vector3D color) { return(Math.Sqrt(0.299 * color.X * color.X + 0.587 * color.Y * color.Y + 0.114 * color.Z * color.Z)); }
public void SetObjectCenter(double x, double y, double z) { ObjectCenter = new OpenTK.Vector3d(x, y, z); }
/// <summary> /// 拡張メソッド. /// </summary> /// <param name="v"></param> /// <returns></returns> public static V3d Mult(this M3d m, V3d v) => new V3d( m.M11 * v.X + m.M12 * v.Y + m.M13 * v.Z, m.M21 * v.X + m.M22 * v.Y + m.M23 * v.Z, m.M31 * v.X + m.M32 * v.Y + m.M33 * v.Z );
/// <summary> /// 拡張メソッド. /// </summary> /// <param name="v"></param> /// <returns></returns> public static Vector3DBase ToVector3DBase(this V3d v) => new Vector3DBase(v.X, v.Y, v.Z);
private static Vector3D Clamp(Vector3D color) { return(new Vector3D(Clamp(color.X), Clamp(color.Y), Clamp(color.Z))); }