规范化函数renderscript

时间:2011-11-18 17:42:49

标签: android opengl-es normalize renderscript

我正在学习android renderscript,目前正在查看轮播示例。这里,多次使用称为“normalize”的函数。例如:

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

我找不到这个功能的意思和作用。我也学习了一点OpenGl ES 2.0,并且遇到了使用normalize标志但从未使用过的函数(标志通常是 - 假的,所以它做了类似于将非浮动值转换为float的东西)。所以如果有人可以给我很好的解释,我会很感激。

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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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]};

}

答案 2 :(得分: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]};
}