예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
 private static Quaternion ToSpirareCoordinate(this Quaternion rotation)
 {
     return(CoordinateUtility.ToSpirareCoordinate(rotation));
 }
예제 #5
0
 private static Vector3 ToSpirareCoordinate(this Vector3 vector3, bool directional = true)
 {
     return(CoordinateUtility.ToSpirareCoordinate(vector3, directional));
 }