在 C++/OpenGL 中围绕另一个对象旋转投影一个对象
Project an object with rotation around another object in C++/OpenGL
我正在使用OpenGL/C++来创建游戏。
我正在开发的这个游戏的一个方面是让一个角色以该角色面对的方式发射射弹。为此,我有一个"玩家"和一个"弹丸"。
我将字符 x 和 y 坐标传递给弹丸,即玩家面对的角度。从这里我想向那个方向射击弹丸。
在我的绘图中,我目前正在使用带有字符 x 和 y 的 glTranslate ,并在角色面对的方式上旋转弹丸。这会将我的射弹移动到玩家面对的方式。
glTranslatef(this->m_X, this->m_Y, 0);
glRotatef(angle, 0, 0, 1);
这就是我卡住的地方,我可以通过增加/减少平移中的 X 和 Y 值来移动弹丸位置。但我想问的是,我怎样才能沿着玩家面对的线移动弹丸。
感谢您的帮助!
坐标矢量进行这些计算。
http://mathworld.wolfram.com/PolarVector.html
极坐标矢量将允许您进行一些计算,这些计算通常以简单的方式复杂而复杂。使用他们的应用数学,您的要求不会成为问题。
这是极性矢量的实现。
头文件:
#include <cmath>
//Using SFML Vector2 class, making a similar class is easy.
//Check this URL: http://www.sfml-dev.org/documentation/2.3.2/classsf_1_1Vector2.php
class PolarVector
{
public:
float r;
float t; ///Angle stored in degrees.
PolarVector();
PolarVector(float radius, float angle);
PolarVector(const sf::Vector2f V2); ///Conversion constructor.
sf::Vector2f TurnToRectangular() const;
};
PolarVector TurnToPolar(const sf::Vector2f point);
float getConvertedRadius(const sf::Vector2f point);
float getConvertedAngle(sf::Vector2f point);
bool operator ==(const PolarVector& left, const PolarVector& right);
bool operator !=(const PolarVector& left, const PolarVector& right);
和源文件:
#include "PolarVector.hpp"
PolarVector::PolarVector()
:r(0.f)
,t(0.f)
{}
PolarVector::PolarVector(float radius, float angle)
:r(radius)
,t(angle)
{}
PolarVector::PolarVector(const sf::Vector2f V2)
:r(getConvertedRadius(V2))
,t(getConvertedAngle(V2))
{}
sf::Vector2f PolarVector::TurnToRectangular() const
{ return sf::Vector2f(static_cast<float>(r* std::cos(t)), static_cast<float>(r* std::sin(t))); }
PolarVector TurnToPolar(const sf::Vector2f point)
{
PolarVector PV;
PV.r = getConvertedAngle(point);
PV.t = getConvertedRadius(point);
return PV;
}
float getConvertedRadius(const sf::Vector2f point)
{ return std::sqrt((point.x * point.x) + (point.y * point.y) ); }
float getConvertedAngle(const sf::Vector2f point)
{ return std::atan2(point.y, point.x); }
bool operator ==(const PolarVector& left, const PolarVector& right)
{
float diffR = left.r - right.r;
float diffA = left.t - right.t;
return ((diffR <= EPSILON) && (diffA <= EPSILON));
}
bool operator !=(const PolarVector& left, const PolarVector& right)
{
float diffR = left.r - right.r;
float diffA = left.t - right.t;
return !((diffR <= EPSILON) && (diffA <= EPSILON));
}
我之所以建议这样做,是因为您可以执行以下操作。
假设您有一个二维向量:
sf::Vector2f character(0.f, 0.f); //Origin point. First parameter is X, second is Y
float angleCharFacesAt = 0.698132; //40 degrees in radians. C++ Trigonometry uses Radians. std::cos, std::sin and std::atan2 are used internally.
对于第一个对象或字符。您希望另一个对象具有相同的角度,但位置不同。
假设另一个对象在其上方有一个位置:
sf::Vector2f object(0.f, 10.f); //Above the origin point.
float angleObjectFacesAt = 0.f; //0 degrees.
所以你需要做的就是使用极坐标矢量旋转它:
PolarVector PV = TurnToPolar(object); //Use this for calculations.
PV.t += angleCharFacesAt; //t is the angle parameter of the polar vector.
object = PV.TurnToRectangular(object);
通过这样做,您将获得对象的旋转位置。
一个物体与另一个物体之间的距离将始终是极坐标矢量的 r(半径)值。因此,您可以通过这样做使距离变长或变短:
PolarVector PV = TurnToPolar(object); //Use this for calculations.
PV.r += 10; //Increase the radius to increase the distance between the objects.
object = PV.TurnToRectangular(object);
您应该尝试理解旋转矩阵和极坐标数学,以便能够用它实现更多的事情,但是使用此代码是可能的。你也应该把所有这些代码放在一个类中,但首先使用它,直到你很好地理解它。
很抱歉回答冗长,但如果不深入研究线性代数,这是一个不容易解释的话题。这些类用于实际代码可管理性(我在自己的游戏中使用这些类),但您只能通过计算重现相同的效果。
我个人更喜欢极地矢量而不是使用旋转矩阵,因为它们的用处不仅仅是旋转对象。但这里有一个链接可以更好地理解旋转矩阵:https://en.wikipedia.org/wiki/Rotation_matrix
使用极坐标矢量完成变换后,只需glTranslation到极坐标矢量给出的最终位置即可。您必须确保围绕正在使用的原点旋转。否则,可能不会按照您希望使用它进行旋转。
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 从多个源构造一个对象,包括一个对象向量
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 检查哪个对象调用了另一个对象的对象方法
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 包装一个对象并假装它是一个 int
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 如何使用函数将一个对象的输入复制到另一个对象中
- 选择一个元素而不是一个对象的数组的原因
- 将四元数旋转的游戏对象旋转另一个四元数时出现问题
- 如何将对象围绕另一个对象(C 和OGRE3D)旋转
- 围绕另一个对象旋转对象
- 旋转一个对象面对另一个C
- 围绕另一个对象旋转的物体不断加速
- 在 C++/OpenGL 中围绕另一个对象旋转投影一个对象
- 如何旋转一个对象使其面向另一个对象