Мне нужно легко изменить масштаб полигона в проекте OpenGL, но по какой-то причине интенсивность света прямо пропорциональна размеру полигонов.
Я пытался перемещать направление света в разные места. Измените интенсивность света и разделите векторы нормалей на скейлере, но это не помогает.
В моем коде 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
scaler
влияет на координаты вершин. Более близкий свет (lightPosition
остается неизменным) к этим координатам изменяет интенсивность, потому что это «точечный свет», а не «направленный свет». См. ИспользованиеglLight
- person Ripi2   schedule 03.05.2019calcNormal()
испускает нормали единичной длины? Похоже, это просто перекрестный продукт, не видящий никаких попыток (повторной) нормализации. Входные данные всегда имеют единичную длину? - person genpfault   schedule 03.05.2019*ATTENUATION
имеют установить (изменить). - person Rabbid76   schedule 03.05.2019lightPosition
. - person Ripi2   schedule 03.05.2019