public override Matrix4x4d DeformedToTangentFrame(Vector3d2 deformedPt)
        {
            Vector3d2 Uz = deformedPt.Normalized();
            Vector3d2 Ux = (new Vector3d2(0, 1, 0)).Cross(Uz).Normalized();
            Vector3d2 Uy = Uz.Cross(Ux);

            return(new Matrix4x4d(Ux.x, Ux.y, Ux.z, 0.0,
                                  Uy.x, Uy.y, Uy.z, 0.0,
                                  Uz.x, Uz.y, Uz.z, -R,
                                  0.0, 0.0, 0.0, 1.0));
        }
        protected override void SetScreenUniforms(TerrainNode node, TerrainQuad quad, MaterialPropertyBlock matPropertyBlock)
        {
            double ox = quad.GetOX();
            double oy = quad.GetOY();
            double l  = quad.GetLength();

            Vector3d2 p0 = new Vector3d2(ox, oy, R);
            Vector3d2 p1 = new Vector3d2(ox + l, oy, R);
            Vector3d2 p2 = new Vector3d2(ox, oy + l, R);
            Vector3d2 p3 = new Vector3d2(ox + l, oy + l, R);
            Vector3d2 pc = (p0 + p3) * 0.5;

            double    l0 = 0.0, l1 = 0.0, l2 = 0.0, l3 = 0.0;
            Vector3d2 v0 = p0.Normalized(ref l0);
            Vector3d2 v1 = p1.Normalized(ref l1);
            Vector3d2 v2 = p2.Normalized(ref l2);
            Vector3d2 v3 = p3.Normalized(ref l3);

            Matrix4x4d deformedCorners = new Matrix4x4d(v0.x * R, v1.x * R, v2.x * R, v3.x * R,
                                                        v0.y * R, v1.y * R, v2.y * R, v3.y * R,
                                                        v0.z * R, v1.z * R, v2.z * R, v3.z * R,
                                                        1.0, 1.0, 1.0, 1.0);

            matPropertyBlock.AddMatrix(m_uniforms.screenQuadCorners, (m_localToScreen * deformedCorners).ToMatrix4x4());

            Matrix4x4d deformedVerticals = new Matrix4x4d(v0.x, v1.x, v2.x, v3.x,
                                                          v0.y, v1.y, v2.y, v3.y,
                                                          v0.z, v1.z, v2.z, v3.z,
                                                          0.0, 0.0, 0.0, 0.0);

            matPropertyBlock.AddMatrix(m_uniforms.screenQuadVerticals, (m_localToScreen * deformedVerticals).ToMatrix4x4());
            matPropertyBlock.AddVector(m_uniforms.screenQuadCornerNorms, new Vector4((float)l0, (float)l1, (float)l2, (float)l3));

            Vector3d2 uz = pc.Normalized();
            Vector3d2 ux = (new Vector3d2(0, 1, 0)).Cross(uz).Normalized();
            Vector3d2 uy = uz.Cross(ux);

            Matrix4x4d ltow = node.GetLocalToWorld();

            Matrix3x3d tangentFrameToWorld = new Matrix3x3d(ltow.m[0, 0], ltow.m[0, 1], ltow.m[0, 2],
                                                            ltow.m[1, 0], ltow.m[1, 1], ltow.m[1, 2],
                                                            ltow.m[2, 0], ltow.m[2, 1], ltow.m[2, 2]);

            Matrix3x3d m = new Matrix3x3d(ux.x, uy.x, uz.x,
                                          ux.y, uy.y, uz.y,
                                          ux.z, uy.z, uz.z);

            matPropertyBlock.AddMatrix(m_uniforms.tangentFrameToWorld, (tangentFrameToWorld * m).ToMatrix4x4());
        }
예제 #3
0
    public Quat(Vector3d2 to, Vector3d2 _from)
    {
        Vector3d2 f = _from.Normalized();
        Vector3d2 t = to.Normalized();

        double dotProdPlus1 = 1.0 + f.Dot(t);

        if (dotProdPlus1 < 1e-7)
        {
            w = 0;
            if (System.Math.Abs(f.x) < 0.6)
            {
                double norm = System.Math.Sqrt(1 - f.x * f.x);
                x = 0;
                y = f.z / norm;
                z = -f.y / norm;
            }
            else if (System.Math.Abs(f.y) < 0.6)
            {
                double norm = System.Math.Sqrt(1 - f.y * f.y);
                x = -f.z / norm;
                y = 0;
                z = f.x / norm;
            }
            else
            {
                double norm = System.Math.Sqrt(1 - f.z * f.z);
                x = f.y / norm;
                y = -f.x / norm;
                z = 0;
            }
        }
        else
        {
            double    s   = System.Math.Sqrt(0.5 * dotProdPlus1);
            Vector3d2 tmp = (f.Cross(t)) / (2.0 * s);
            x = tmp.x;
            y = tmp.y;
            z = tmp.z;
            w = s;
        }
    }