为什么,当我缩放多边形时,我的光强度会发生变化?
Why, when i scale polygons my light intensity changes?
我需要在 OpenGL 项目中轻松更改多边形比例,但由于某种原因,光强度与多边形的大小成正比。
我试图将光线方向移动到不同的地方。更改缩放器上的光强度和 div 法向量,但没有帮助。
在我的代码中 scaler
表示多边形压缩 => 如果 scaler = 2
, poly
变为大小的 0.5
顶点坐标:
verticesMatrix[i][k] = new Vector3f((float) (i - cellCount / 2) / scaler,
(float) 0, (float) (k - cellCount / 2) / scaler);
计算法线:
public void calcNormal(Vector3f s1, Vector3f s2, Vector3f s3) {
Vector3f a = new Vector3f(s2.x - s1.x, s2.y - s1.y, s2.z - s1.z);
Vector3f b = new Vector3f(s3.x - s2.x, s3.y - s2.y, s3.z - s2.z);
Vector3f normal = new Vector3f(a.y * b.z - a.z * b.y, a.z * b.x - a.x
* b.z, a.x * b.y - a.y * b.x);
glNormal3f(normal.x, normal.y, normal.z);
}
灯光设置:
private static float[] lightPosition = {-2.19f, 100.36f, 11.45f, 1f};
private static void setUpLighting() {
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightModel(GL_LIGHT_MODEL_AMBIENT,
BufferTools.asFlippedFloatBuffer(new float[]{0.0f, 0.0f, 0.0f, 1f}));
glLight(GL_LIGHT0, GL_POSITION,
BufferTools.asFlippedFloatBuffer(lightPosition));
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_DIFFUSE);
}
我需要使用不同的缩放器获得相同的光线。我不知道它如何影响光线,因为我检查了所有代码,而且我没有使用光线缩放器。结果图片:https://yadi.sk/i/kxQLvRSTP7LYVA
我需要像这样正常化:
public void calcNormal(Vector3f s1, Vector3f s2, Vector3f s3) {
Vector3f a = new Vector3f(s2.x - s1.x, s2.y - s1.y, s2.z - s1.z);
Vector3f b = new Vector3f(s3.x - s2.x, s3.y - s2.y, s3.z - s2.z);
Vector3f normal = new Vector3f(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);
float length = (float)Math.pow(normal.x * normal.x + normal.y * normal.y + normal.z * normal.z, 0.5f);
glNormal3f(normal.x / length, normal.y / length, normal.z / length);
}
我需要在 OpenGL 项目中轻松更改多边形比例,但由于某种原因,光强度与多边形的大小成正比。
我试图将光线方向移动到不同的地方。更改缩放器上的光强度和 div 法向量,但没有帮助。
在我的代码中 scaler
表示多边形压缩 => 如果 scaler = 2
, poly
变为大小的 0.5
顶点坐标:
verticesMatrix[i][k] = new Vector3f((float) (i - cellCount / 2) / scaler,
(float) 0, (float) (k - cellCount / 2) / scaler);
计算法线:
public void calcNormal(Vector3f s1, Vector3f s2, Vector3f s3) {
Vector3f a = new Vector3f(s2.x - s1.x, s2.y - s1.y, s2.z - s1.z);
Vector3f b = new Vector3f(s3.x - s2.x, s3.y - s2.y, s3.z - s2.z);
Vector3f normal = new Vector3f(a.y * b.z - a.z * b.y, a.z * b.x - a.x
* b.z, a.x * b.y - a.y * b.x);
glNormal3f(normal.x, normal.y, normal.z);
}
灯光设置:
private static float[] lightPosition = {-2.19f, 100.36f, 11.45f, 1f};
private static void setUpLighting() {
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightModel(GL_LIGHT_MODEL_AMBIENT,
BufferTools.asFlippedFloatBuffer(new float[]{0.0f, 0.0f, 0.0f, 1f}));
glLight(GL_LIGHT0, GL_POSITION,
BufferTools.asFlippedFloatBuffer(lightPosition));
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_DIFFUSE);
}
我需要使用不同的缩放器获得相同的光线。我不知道它如何影响光线,因为我检查了所有代码,而且我没有使用光线缩放器。结果图片:https://yadi.sk/i/kxQLvRSTP7LYVA
我需要像这样正常化:
public void calcNormal(Vector3f s1, Vector3f s2, Vector3f s3) {
Vector3f a = new Vector3f(s2.x - s1.x, s2.y - s1.y, s2.z - s1.z);
Vector3f b = new Vector3f(s3.x - s2.x, s3.y - s2.y, s3.z - s2.z);
Vector3f normal = new Vector3f(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);
float length = (float)Math.pow(normal.x * normal.x + normal.y * normal.y + normal.z * normal.z, 0.5f);
glNormal3f(normal.x / length, normal.y / length, normal.z / length);
}