我正在学习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!
答案 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]};
}