OpenGL Spaceship 推进器在底部不是圆形的

Posted

技术标签:

【中文标题】OpenGL Spaceship 推进器在底部不是圆形的【英文标题】:OpenGL Spaceship thruster is not circular at base 【发布时间】:2021-01-15 18:44:15 【问题描述】:

我正在使用 OpenGL 开发一款太空射击游戏。尝试使用粒子为玩家的飞船创建推进器效果。我面临一个问题,即推进器的底座在飞船的某些角度下不是圆形的。你可以在video看到效果。

这是计算圆底的代码:

float random = fmod(static_cast<float>(rand()) / 100.0, mSize);
glm::vec3 radius = (mUp * random) + (mRight * random);
float angle = (float)i / (float)mNumOfInstances * 360.0f;

float x = mPos.x + glm::cos(angle) * radius.x;
float y = mPos.y + glm::sin(angle) * radius.y;
float z = mPos.z + glm::cos(angle) * radius.z;
particle.Position = glm::vec3(x, y, z);

有人可以建议对此代码进行任何更正以解决问题吗?

【问题讨论】:

根据视频,上面的代码似乎是正确的,因为这是在计算位置。在视频中,位置总是正确的——有些旋转或缩放是错误的,但上面的代码与此无关。我的猜测是您对比例/旋转矩阵的操作不正确,但这是我们看不到的其他代码。 @cdhowie 我认为这是错误的。上面的代码创建了一个具有静态方向的圆形基础,始终由使用的 sin 和 cos 定义。我想让这个方向与飞船的方向动态变化,所以我必须以某种方式将飞船的旋转涉及到上面的代码,或者找到一种方法来沿着飞船的后向量创建圆形底座,但我没有不知道所涉及的数学 我说的是正确的,你的解决方案也是正确的——通过引入旋转来计算圆上的坐标,而不是像我一样使用旋转矩阵暗示。使用旋转矩阵来执行此操作可能会更有效;您的解决方案需要在 CPU 上完成这项工作,而操纵旋转矩阵可以将同样的工作卸载到 GPU。 【参考方案1】:

对于遇到相同问题的任何人,解决方案如下:

glm::vec3 up = (mUp * random);
glm::vec3 right = (mRight * random);
particle.Position = mPos + glm::cos(angle) * up + sin(angle) * right;

mUp 是 Up 向量,mRight 是飞船的右向量,angle 是特定点的角度 (0-360),random 是随机半径,因为我想要一个实心圆。

【讨论】:

以上是关于OpenGL Spaceship 推进器在底部不是圆形的的主要内容,如果未能解决你的问题,请参考以下文章

如何投影openGL控件的顶部和底部区域

OpenGL ES 2 控制台帧缓冲光标

英伟达和Valve将携手推进Vulkan开发

BOI 2003 Problem. Spaceship

Spaceship::UnexpectedResponse: [!] Missing required information to submit for external testing - Mis

strcmp() 和 Spaceship Operator (<=>) 有啥区别