Heroes_of_Hiis/Assets/Polaris - Low Poly Ecosystem/Polaris - Low Poly Terrain .../Samples/Pinwheel Studio/Scripts/GCameraBuoyancyController.cs

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