Я использую OpenGL для создания трехмерного пространства.
У меня есть космический корабль, который может стрелять лазерами.
До сих пор у меня было это так, что лазеры будут просто глубже в Z-оси после запуска.
Но я пытаюсь создать правильную систему прицеливания с перекрестием, чтобы вы могли целиться и стрелять в любом направлении, но мне не удалось обновить путь лазера.
У меня есть вектор направления, основанный на концевом наконечнике лазера и начальном наконечнике, который получен при наведении.
Как правильно обновить значения X, Y, Z (или векторы) лазера, чтобы он выглядел естественно?
Я думаю, что я вижу.
Допустим, вы начинаете с направления прицеливания как трехмерного вектора, назовите его «aimDir». Затем в цикле обновления добавьте все 3 (x, y и z) в «позицию» снаряда. (Хорошо, со скоростью света вы на самом деле не увидите никаких движений, но я думаю, что вижу, для чего вы здесь).
void OnUpdate( float deltaT )
{
// "move" the laser in the aiming direction, scaled by the amount of time elapsed
// since our last update (you probably want another scale factor here to control
// how "fast" the laser appears to move)
Vector3 deltaLaser = deltaT * aimDir; // calc 3d offset for this frame
laserEndpoint += deltaLaser; // add it to the end of the laser
}
затем в процедуре рендеринга проведите лазер от точки запуска до новой конечной точки:
void OnRender()
{
glBegin(GL_LINES);
glVertex3f( gunPos.x, gunPos.Y, gunPos.z );
glVertex3f( laserEndPoint.x, laserEndPoint.y, laserEndPoint.z );
glEnd();
}
Я беру некоторые вольности, потому что я не знаю, используете ли вы перенасыщение, SDL или что. Но я уверен, что у вас есть хотя бы функция обновления и функция рендеринга.
Предупреждение, просто нарисовать линию от пистолета до конца лазера может быть неприятно визуально, но это будет критическим ориентиром для добавления лучших эффектов (системы частиц, фильтр Блума и т. Д.). Быстрое улучшение может заключаться в том, чтобы сделать переднюю часть лазера (линии) ярким, а заднюю часть — черной. И / или сделать несколько линий, как пулемет. Не стесняйтесь экспериментировать 😉
Также, если источник лазера находится прямо перед зрителем, вы просто увидите точку! Таким образом, вы можете захотеть немного обмануть и выстрелить чуть ниже или справа от зрителя, а затем включить огонь немного вверх или внутрь. Особенно, если у вас по одному на каждой стороне (крыло?), Которые кажутся сходящимися, как в обычной машине пушки.
Надеюсь, это полезно.
Других решений пока нет …