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()); }
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; } }