52 lines
1.6 KiB
C#
52 lines
1.6 KiB
C#
using UnityEngine;
|
|
using System.Collections;
|
|
|
|
public class EngineRod : MonoBehaviour
|
|
{
|
|
public Transform anchor;
|
|
public Transform piston;
|
|
|
|
public float rodLength;
|
|
public Vector3 upVector;
|
|
|
|
private Vector3 startPosition;
|
|
private Quaternion rotation;
|
|
private Quaternion pistonRotation;
|
|
// Use this for initialization
|
|
void Start ()
|
|
{
|
|
upVector = piston.position - anchor.position;
|
|
|
|
rodLength = (transform.localPosition - transform.parent.InverseTransformPoint(piston.position)).magnitude;
|
|
|
|
upVector.Normalize();
|
|
startPosition = transform.localPosition;
|
|
upVector = transform.parent.InverseTransformVector(upVector);
|
|
|
|
rotation = transform.localRotation;
|
|
pistonRotation = piston.localRotation;
|
|
}
|
|
|
|
public float projectionDistance;
|
|
// Update is called once per frame
|
|
void Update () {
|
|
if (anchor != null)
|
|
{
|
|
transform.position = anchor.position;
|
|
|
|
Ray r = new Ray(startPosition, upVector);
|
|
var localPosProjected = r.Project(transform.localPosition);
|
|
projectionDistance = (localPosProjected - transform.localPosition).magnitude;
|
|
|
|
float pistonOffset = Mathf.Sqrt(rodLength*rodLength - projectionDistance*projectionDistance);
|
|
|
|
float angle = (90.0f - Mathf.Asin(pistonOffset/rodLength) * Mathf.Rad2Deg) *- Mathf.Sign(Vector3.Dot(transform.localPosition - localPosProjected, Vector3.forward));
|
|
|
|
|
|
transform.localRotation = Quaternion.AngleAxis(angle, Vector3.right) * rotation;
|
|
|
|
piston.localRotation = pistonRotation * Quaternion.AngleAxis(-angle, Vector3.right);
|
|
}
|
|
}
|
|
}
|