53 lines
1.7 KiB
C#
53 lines
1.7 KiB
C#
#if POSEIDON
|
|
using UnityEngine;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Pinwheel.Poseidon;
|
|
|
|
namespace Pinwheel.Griffin
|
|
{
|
|
[ExecuteInEditMode]
|
|
public class GCameraBuoyancyController : MonoBehaviour
|
|
{
|
|
public PWater water;
|
|
public float speed;
|
|
public Transform lookAt;
|
|
|
|
private void Update()
|
|
{
|
|
if (water == null)
|
|
return;
|
|
Vector3 p = GetPosition(transform.position);
|
|
Vector3 p0 = GetPosition(transform.position + Vector3.left);
|
|
Vector3 p1 = GetPosition(transform.position + Vector3.forward);
|
|
Vector3 p2 = GetPosition(transform.position + Vector3.right);
|
|
Vector3 p3 = GetPosition(transform.position + Vector3.back);
|
|
|
|
Vector3 center = (p + p0 + p1 + p2 + p3) / 5f;
|
|
Vector3 n0 = Vector3.Cross(p0 - p, p1 - p);
|
|
Vector3 n1 = Vector3.Cross(p1 - p, p2 - p);
|
|
Vector3 n2 = Vector3.Cross(p2 - p, p3 - p);
|
|
Vector3 n3 = Vector3.Cross(p3 - p, p0 - p);
|
|
Vector3 up = (n0 + n1 + n2 + n3) / 4f;
|
|
|
|
transform.position = center;
|
|
transform.up = Vector3.Lerp(transform.up, up, 0.01667f * speed);
|
|
|
|
if (lookAt != null)
|
|
{
|
|
transform.LookAt(lookAt.position, transform.up);
|
|
}
|
|
}
|
|
|
|
private Vector3 GetPosition(Vector3 worldPoint)
|
|
{
|
|
Vector3 localPoint = water.transform.InverseTransformPoint(worldPoint);
|
|
localPoint.y = 0;
|
|
localPoint = PWaterExtension.GetLocalVertexPosition(water, localPoint, true);
|
|
worldPoint = water.transform.TransformPoint(localPoint);
|
|
return worldPoint;
|
|
}
|
|
}
|
|
}
|
|
#endif
|