public Vector4[] calcDisplayLineSegmentCoord(float world_x1, float world_y1, float world_x2, float world_y2) { Vector4 vec3d_1 = new Vector4(world_x1, 0, world_y1, 1); Vector4 vec2d_1 = calc3Dto2D(vec3d_1); Vector4 vec3d_2 = new Vector4(world_x2, 0, world_y2, 1); Vector4 vec2d_2 = calc3Dto2D(vec3d_2); if (vec2d_1.W <= 0 && vec2d_2.W <= 0) { return(null); } else if (vec2d_1.W > 0 && vec2d_2.W > 0) { vec2d_1 = vec2d_1 / vec2d_1.W; vec2d_2 = vec2d_2 / vec2d_2.W; return(new Vector4[] { Vector4.Transform(vec2d_1, viewportMatrix), Vector4.Transform(vec2d_2, viewportMatrix) }); } else { // XZ平面上で、カメラと焦点のベクトルに直行し且つカメラ(XZ)を通過するベクトルと、起点・終点の交差する点を求める // カメラ(XZ)を中心に視点を時計回りに回転させた座標 Coordinate camera_coord = new Coordinate(cameraX, cameraZ); Coordinate focus_coord = new Coordinate(mapCenterX, mapCenterZ); Coordinate focus_rotate_coord = CoordinateUtility.calcRotationCoordinate(camera_coord, focus_coord, 90.0); // カメラ(XZ)と求めた座標をとおる線と起点・終点の交点を計算 Coordinate intersection_coord = CoordinateUtility.intersection(camera_coord, focus_rotate_coord, new Coordinate(world_x1, world_y1), new Coordinate(world_x2, world_y2)); if (intersection_coord != null) { if (vec2d_1.W < 0) { vec3d_1 = new Vector4(intersection_coord.x, 0, intersection_coord.y, 1); vec2d_1 = calc3Dto2D(vec3d_1); } else { vec3d_2 = new Vector4(intersection_coord.x, 0, intersection_coord.y, 1); vec2d_2 = calc3Dto2D(vec3d_2); } if (vec2d_1.W <= 0 && vec2d_2.W <= 0) { return(null); } else if (vec2d_1.W > 0 && vec2d_2.W > 0) { vec2d_1 = vec2d_1 / vec2d_1.W; vec2d_2 = vec2d_2 / vec2d_2.W; return(new Vector4[] { Vector4.Transform(vec2d_1, viewportMatrix), Vector4.Transform(vec2d_2, viewportMatrix) }); } } } return(null); }
public bool TryReadVector3(out Vector3 vector, bool directional = true) { if (TryReadFloat(out var x) && TryReadFloat(out var y) && TryReadFloat(out var z)) { vector = CoordinateUtility.ToUnityCoordinate(x, y, z, directional); return(true); } vector = Vector3.zero; return(false); }
public bool TryReadQuaternion(out Quaternion quaternion) { if (TryReadFloat(out var x) && TryReadFloat(out var y) && TryReadFloat(out var z) && TryReadFloat(out var w)) { quaternion = CoordinateUtility.ToUnityCoordinate(x, y, z, w); return(true); } quaternion = Quaternion.identity; return(false); }
private static Quaternion ToSpirareCoordinate(this Quaternion rotation) { return(CoordinateUtility.ToSpirareCoordinate(rotation)); }
private static Vector3 ToSpirareCoordinate(this Vector3 vector3, bool directional = true) { return(CoordinateUtility.ToSpirareCoordinate(vector3, directional)); }