public void Position(GameObject gobj, float alpha, float crossalpha, float yrot, float scl) { if (surfaceLoft && surfaceLayer >= 0) { MegaLoftLayerSimple layer = (MegaLoftLayerSimple)surfaceLoft.Layers[surfaceLayer]; Vector3 at = Vector3.zero; Vector3 up = Vector3.zero; Vector3 right = Vector3.zero; Vector3 fwd = Vector3.zero; Vector3 p = layer.GetPosAndFrame(surfaceLoft, crossalpha, alpha, tangent, out at, out up, out right, out fwd); p += up * offset; Quaternion rot = Quaternion.LookRotation(fwd, up); Quaternion rot1 = Quaternion.Euler(uprot); rot = Quaternion.Lerp(rot, rot1, upright); Vector3 lrot = rotate; lrot.y += yrot; gobj.transform.rotation = rot * Quaternion.Euler(lrot); gobj.transform.position = layer.transform.TransformPoint(p); gobj.transform.localScale = new Vector3(scl, scl, scl); } }
public Vector3 GetPoint(float dist, float crossa) { Vector3 retval = Vector3.zero; if (surfaceLoft && surfaceLayer >= 0) { MegaLoftLayerSimple layer = (MegaLoftLayerSimple)surfaceLoft.Layers[surfaceLayer]; Vector3 at = Vector3.zero; Vector3 up = Vector3.zero; Vector3 right = Vector3.zero; Vector3 fwd = Vector3.zero; float a = dist / layer.layerPath.splines[layer.curve].length; Vector3 p = layer.GetPosAndFrame(surfaceLoft, crossa, a, tangent, out at, out up, out right, out fwd); p += up * offset; p = layer.transform.TransformPoint(p); retval = transform.worldToLocalMatrix.MultiplyPoint3x4(p); } return(retval); }
Vector3 Deform(Vector3 p, MegaShapeLoft loft, MegaLoftLayerSimple layer, float percent, float ca, float off, Vector3 scale, float removeDof, Vector3 locoff) { p = tm.MultiplyPoint3x4(p); p.x *= scale.x; p.y *= scale.y; p.z *= scale.z; p.z += off; p += locoff; float alpha = (p.z * LayerLength) + percent; if (useCrossCrv) { ca += CrossCrv.Evaluate(alpha); } Vector3 ps1; Vector3 ps; if (CalcUp) { Vector3 upv = Vector3.zero; Vector3 right = Vector3.zero; Vector3 fwd = Vector3.zero; ps = layer.GetPosAndFrame(loft, ca, alpha, (tangent * 0.001f), out ps1, out upv, out right, out fwd); tw = Quaternion.LookRotation(fwd, upv); Quaternion rot = tw * meshrot; if (useTwist) { rot *= Quaternion.AngleAxis(180.0f + (twist * twistCrv.Evaluate(alpha)), Vector3.forward); } else { rot *= Quaternion.AngleAxis(180.0f, Vector3.forward); } //wtm.SetTRS(ps, rot, Vector3.one); MegaMatrix.SetTR(ref wtm, ps, rot); wtm = mat * wtm; p.z = 0.0f; return(wtm.MultiplyPoint3x4(p)); } else { ps = layer.GetPosAndLook(loft, ca, alpha, (tangent * 0.001f), out ps1); if (useTwist) { tw = meshrot * Quaternion.AngleAxis((twist * twistCrv.Evaluate(alpha)), Vector3.forward); // * meshrot; } else { tw = meshrot * Quaternion.AngleAxis(0.0f, Vector3.forward); // * meshrot; } } Vector3 relativePos = ps1 - ps; relativePos.y *= removeDof; if (relativePos == Vector3.zero) { relativePos = lastrel; //Vector3.forward; } lastrel = relativePos; Quaternion rotation = Quaternion.LookRotation(relativePos) * tw; // * meshrot; MegaMatrix.SetTR(ref wtm, ps, rotation); //wtm.SetTRS(ps, rotation, Vector3.one); wtm = mat * wtm; p.z = 0.0f; return(wtm.MultiplyPoint3x4(p)); }
Vector3 Deform(Vector3 p, MegaShapeLoft loft, MegaLoftLayerSimple layer, float percent, float ca, float off, Vector3 scale, float removeDof, Vector3 locoff) { p = tm.MultiplyPoint3x4(p); p.x *= scale.x; p.y *= scale.y; p.z *= scale.z; p.z += off; p += locoff; float alpha = (p.z * LayerLength) + percent; if ( useCrossCrv ) ca += CrossCrv.Evaluate(alpha); Vector3 ps1; Vector3 ps; if ( CalcUp ) { Vector3 upv = Vector3.zero; Vector3 right = Vector3.zero; Vector3 fwd = Vector3.zero; ps = layer.GetPosAndFrame(loft, ca, alpha, (tangent * 0.001f), out ps1, out upv, out right, out fwd); tw = Quaternion.LookRotation(fwd, upv); Quaternion rot = tw * meshrot; if ( useTwist ) rot *= Quaternion.AngleAxis(180.0f + (twist * twistCrv.Evaluate(alpha)), Vector3.forward); else rot *= Quaternion.AngleAxis(180.0f, Vector3.forward); //wtm.SetTRS(ps, rot, Vector3.one); MegaMatrix.SetTR(ref wtm, ps, rot); wtm = mat * wtm; p.z = 0.0f; return wtm.MultiplyPoint3x4(p); } else { ps = layer.GetPosAndLook(loft, ca, alpha, (tangent * 0.001f), out ps1); if ( useTwist ) tw = meshrot * Quaternion.AngleAxis((twist * twistCrv.Evaluate(alpha)), Vector3.forward); // * meshrot; else tw = meshrot * Quaternion.AngleAxis(0.0f, Vector3.forward); // * meshrot; } Vector3 relativePos = ps1 - ps; relativePos.y *= removeDof; if ( relativePos == Vector3.zero ) { relativePos = lastrel; //Vector3.forward; } lastrel = relativePos; Quaternion rotation = Quaternion.LookRotation(relativePos) * tw; // * meshrot; MegaMatrix.SetTR(ref wtm, ps, rotation); //wtm.SetTRS(ps, rotation, Vector3.one); wtm = mat * wtm; p.z = 0.0f; return wtm.MultiplyPoint3x4(p); }
void DoUpdate() { if (surfaceLoft && surfaceLayer >= 0) { MegaLoftLayerSimple layer = (MegaLoftLayerSimple)surfaceLoft.Layers[surfaceLayer]; if (animate) { distance += speed * Time.deltaTime; distance = Mathf.Repeat(distance, layer.layerPath.splines[layer.curve].length); alpha = distance / layer.layerPath.splines[layer.curve].length; } Vector3 at = Vector3.zero; Vector3 up = Vector3.zero; Vector3 right = Vector3.zero; Vector3 fwd = Vector3.zero; if (mode == MegaWalkMode.Distance) { alpha = distance / layer.layerPath.splines[layer.curve].length; } else { distance = alpha * layer.layerPath.splines[layer.curve].length; } Vector3 p = layer.GetPosAndFrame(surfaceLoft, crossalpha, alpha, tangent, out at, out up, out right, out fwd); p += up * offset; //up = -Vector3.up; Quaternion rot = Quaternion.LookRotation(fwd, up); Quaternion rot1 = Quaternion.Euler(uprot); rot = Quaternion.Lerp(rot, rot1, upright); Quaternion locrot = Quaternion.Euler(rotate); if (!initrot && delay != 0.0f) { rot = Quaternion.Slerp(transform.rotation, rot * locrot, Time.deltaTime * delay); } else { initrot = false; rot = rot * locrot; } transform.rotation = rot; // * locrot; transform.position = layer.transform.TransformPoint(p); #if false //float a = 0.0f; if (mode == MegaWalkMode.Distance) { alpha = distance / surfaceLoft.Layers[surfaceLayer].layerPath.splines[0].length; } else { distance = alpha * surfaceLoft.Layers[surfaceLayer].layerPath.splines[0].length; } Vector3 p = layer.GetPosAndFrame(surfaceLoft, crossalpha, alpha, tangent, out at, out up, out right, out fwd); p += up * offset; Quaternion rot = Quaternion.LookRotation(fwd, up); Quaternion locrot = Quaternion.Euler(rotate); if (delay != 0.0f) { rot = Quaternion.Slerp(transform.rotation, rot * locrot, delay); } else { rot = rot * locrot; } transform.rotation = rot; // * locrot; transform.position = layer.transform.TransformPoint(p); #endif } }