问题: 我有一个函数来计算给定 X 和 Z 坐标的波的 Y 值(高度)。此时我也需要法线,即此时切线/渐变的法线。
背景资料:
到目前为止我有什么
using UnityEngine;
using System.Collections;
public class Weather : MonoBehaviour
{
//The height of the waves
public float amplitude = 0.01f;
//The number of waves
public float frequency = 50f;
//The speed the direction of the waves rotate
public float directionChange;
// Update is called once per frame, every frame it is rotated a small amount.
//using transform.rotate allows for easy rotation and reference to its direction with transform.forward is automaticlly normalised.
void FixedUpdate ()
{
//Rotates around the y axis
transform.RotateAround (transform.position, Vector3.up, directionChange * Time.deltaTime);
}
//Gets the height (y value) of the wave at an (x,z) position. At each frame the amplitude, time, frequency and direction are considered constant so that but these all change with between each frame.
public float heightAt (float x, float z)
{
return amplitude * Mathf.Sin (Time.realtimeSinceStartup + x * frequency * transform.forward.x + z * frequency * transform.forward.z);
}
//This needs to use the same function as the heightAt(x, z) method so that the normal at a point can be calculated e.g. the normal at a point on top of the wave would be straight up
public Vector3 normalAt (float x, float z)
{
return Vector3.up;
}
}
我的研究发现了链条规则,我一直试图[不成功]使用它。 我遇到困难的是得到渐变的归一化向量(这样我就可以得到法线的归一化向量)
我需要找到法线以便我可以通过使用节点来计算船上的浮力,这些节点可以通过检查它们是否在水中来计算应用于其父对象(船)的力。 如果节点位于波浪之上,那么它将对船施加重力,如果在波浪下面,它将使用法线施加力,以便它被波浪推动。
希望我已经足够清楚,你可以理解。 感谢您阅读:)
答案 0 :(得分:2)
嗯...应该是这样的:
public Vector3 normalAt (float x, float z)
{
float argument = Time.realtimeSinceStartup + x * frequency * transform.forward.x + z * frequency * transform.forward.z;
float nx = amplitude * frequency * transform.forward.x * Mathf.Cos(argument);
float ny = -1.0f;
float nz = amplitude * frequency * transform.forward.z * Mathf.Cos(argument);
return new Vector3(nx, ny, nz).normalized; // Not sure about sign. Maybe you need to multiply the result by -1.
}