c++ - openGL 聚光灯问题

标签 c++ opengl graphics

好吧,我正在尝试模仿手电筒的行为。目前我只是想让聚光灯出现在球体上。现在下面的代码可以工作,但只有当GL_SPOT_CUTOFF设置为180时才有效,这会创建均匀的光线分布 - 这不是我想要的。如果我尝试将其设置为任何其他值,那么它就会停止工作。这是代码

GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat light_pos [4] = {5, 2, -10, 1.0};

glLightfv (GL_LIGHT0, GL_SPECULAR, mat_specular);
glLightfv (GL_LIGHT0, GL_POSITION, light_pos);

glLightf (GL_LIGHT0, GL_SPOT_CUTOFF, 20.0f);
glLightf (GL_LIGHT0, GL_SPOT_EXPONENT, 100.0);

GLfloat spotDir [] = {0.0, 0.0, 0.0};
glLightfv (GL_LIGHT0, GL_SPOT_DIRECTION, spotDir);

glutSolidSphere (2, 20, 20);

glFlush ();
glutSwapBuffers ();

我已经启用了照明并完成了所有初始化工作。所有表面法线都是从 glutSolidSphere 计算出来的,所以不知道还有什么可能会失败......有什么想法吗?

最佳答案

问题在于您的 spotDir。它是一个 vector ,而不是世界坐标中的一个点。 尝试将其更改为:

GLfloat spotDir[] = { -5, -2, 10 };

我很懒,所以我不会标准化这个 vector ;D

这会将您的聚光灯指向球体中心。

希望对你有帮助!

关于c++ - openGL 聚光灯问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13554654/

相关文章:

c++ - 在派生类中使用 noexcept

c++ - 更改 OpenGL 的 z 缓冲区的值

c++ - 使用浮点坐标绘制poly()

python - 删除颜色图的一部分

c++ - 如何保持内联调用但避免编译器警告?

c++ - 为什么输出图像会旋转?

visual-studio-2008 - Visual Studio中有关退出声明的错误

c++ - QQuickFramebufferObject重绘只显示清晰颜色

.net - 使用 .NET 的跨平台图形 3D

c++ - 在 C++ 中重载复合赋值运算符