0

我正在学习 android 渲染脚本,目前正在查看轮播示例。在这里,一个叫做“normalize”的函数被多次使用。例如:

float3 eye, float3 center;
float3 f = normalize(center - eye);

我找不到这个函数的含义和作用。我也在学习一点 OpenGl ES 2.0 并且遇到了使用规范化标志但从未使用过的函数(该标志通常是 - false 所以它做了类似将非浮点值转换为浮点的事情)......所以如果有人可以给我一个很好的解释,我将不胜感激。

另外,我需要将大部分代码从 renderscript 移植到 opengl es 2.0,所以请记住,我也必须在 java 中使用这个函数。(也许写它?)谢谢!

4

3 回答 3

0

我不确定 RenderScript,但在 GLSL 中 normalize(x) 返回与 x 方向相同但具有单位长度(长度为 1)的向量。

通常,规范化意味着将值转换为某个范围内。例如在Time.normalize(bool)

于 2011-11-18T20:26:47.397 回答
0

我已经设法实现了 normalize 函数,用于规范化 3d 矢量。为了规范化,您需要将向量(x、y 和 z)的每个值除以其大小。这是代码:

private static float[] normalize(float[] _vector){
float magnitude;
magnitude = (float)(Math.sqrt(_vector[0]*_vector[0] + _vector[1]*_vector[1]  + _vector[2]*_vector[2]));
_vector[0] = _vector[0]/magnitude;
_vector[1] = _vector[1]/magnitude;
_vector[2] = _vector[2]/magnitude;

return new float[]{_vector[0], _vector[1], _vector[2]};

}
于 2011-11-21T12:27:50.880 回答
0

对已接受答案中的公式稍作更正:

private static float[] normalize(float[] _vector){
float magnitude;
magnitude = (float)(Math.sqrt(_vector[0]*_vector[0] + _vector[1]*_vector[1]  + _vector[2]*_vector[2]));
_vector[0] = _vector[0]/magnitude;
_vector[1] = _vector[1]/magnitude;
_vector[2] = _vector[2]/magnitude;

return new float[]{_vector[0], _vector[1], _vector[2]};
}
于 2012-01-04T00:34:13.653 回答