- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
几个小时以来,我一直在努力解决这个问题,但我根本想不出一个解决方案:我想要实现的是将方向 vector 转换为 3 glm::rotation
调用。
我有一个位于 (0, 0, 0)
的圆柱体,具有一定的半径和高度。使用 Leap Motion SDK,我正在执行工具跟踪,为我提供尖端位置和方向 vector (表示为指向与尖端相同方向的单位 vector ):
来源:https://developer.leapmotion.com/documentation/skeletal/java/api/Leap.Pointable.html
此外,yaw
、pitch
和 roll
可以使用以下 SDK 函数从该 vector 中提取:
/// The yaw angle in radians.
///
/// Yaw is the angle between the negative z-axis and the projection of
/// the vector onto the x-z plane. In other words, yaw represents rotation
/// around the y-axis. If the vector points to the right of the negative z-axis,
/// then the returned angle is between 0 and pi radians (180 degrees);
/// if it points to the left, the angle is between 0 and -pi radians.
///
/// \image html images/Math_Yaw_Angle.png
///
/// @returns The angle of this vector to the right or left of the negative z-axis.
float yaw() const
{
return std::atan2(x, -z);
}
/// The pitch angle in radians.
///
/// Pitch is the angle between the negative z-axis and the projection of
/// the vector onto the y-z plane. In other words, pitch represents rotation
/// around the x-axis.
/// If the vector points upward, the returned angle is between 0 and pi radians
/// (180 degrees); if it points downward, the angle is between 0 and -pi radians.
///
/// \image html images/Math_Pitch_Angle.png
///
/// @returns The angle of this vector above or below the horizon (x-z plane).
float pitch() const {
return std::atan2(y, -z);
}
/// The roll angle in radians.
///
/// Roll is the angle between the negative y-axis and the projection of
/// the vector onto the x-y plane. In other words, roll represents rotation
/// around the z-axis. If the vector points to the left of the negative y-axis,
/// then the returned angle is between 0 and pi radians (180 degrees);
/// if it points to the right, the angle is between 0 and -pi radians.
///
/// \image html images/Math_Roll_Angle.png
///
/// Use this function to get roll angle of the plane to which this vector is a
/// normal. For example, if this vector represents the normal to the palm,
/// then this function returns the tilt or roll of the palm plane compared
/// to the horizontal (x-z) plane.
///
/// @returns The angle of this vector to the right or left of the y-axis.
float roll() const {
return std::atan2(x, -y);
}
在我的 OpenGL 渲染循环中,我在每一帧中提取尖端位置和方向 vector 。我通过以下方式将模型矩阵作为统一变量传递给我的着色器:
cylinder->ResetModelMatrix(); // Set model matrix to identity
glm::vec3 translation = glm::vec3(toolTipPosition.x, toolTipPosition.y, toolTipPosition.z);
cylinder->TranslateModel(translation);
cylinderProgram->SetUniform("modelMatrix", cylinder->GetModelMatrix());
仅通过翻译,效果很好,看起来像这样(圆柱体始终朝上):
当我尝试根据 Leap 的工具方向旋转圆柱体时出现问题。我有以下代码:
yaw = toolDirection.yaw() * Leap::RAD_TO_DEG;
// similarly for pitch and roll
cylinder->Rotate(yaw, glm::vec3(0.0f, 1.0f, 0.0f));
// pitch around (1, 0, 0) and roll around (0, 0, 1)
但是,我没有获得正确的方向,当我尝试应用此方法时,圆柱体“闪烁”并在许多方向之间跳跃。
重要的转换函数位于我的圆柱类继承的接口(interface)中...
void Drawable::ResetModelMatrix()
{
this->modelMatrix = glm::mat4(1.0f);
}
void Drawable::TranslateModel(glm::vec3 translationVector)
{
this->modelMatrix = glm::translate(this->modelMatrix, translationVector);
}
void Drawable::RotateModel(float angle_in_degrees, glm::vec3 axisOfRotation)
{
this->modelMatrix = glm::rotate(this->modelMatrix, angle_in_degrees, axisOfRotation);
}
void Drawable::ScaleModel(glm::vec3 scalingVector)
{
this->modelMatrix = glm::scale(this->modelMatrix, scalingVector);
}
...以modelMatrix
作为成员变量。
我在 OpenGL 中和一般情况下扫描了很多关于旋转主题的类似问题,但我不太确定我的代码到底出了什么问题。
最佳答案
我猜对我们所拥有的和我们想要得到的存在一些误解。
情况是,方向 vector 并不能唯一确定物体在空间中的朝向。为了使这个陈述更清楚,让我们仔细看看如何在 3D 空间中表示旋转。
绕原点的旋转具有三个自由度。这意味着,您需要三个独立的参数来唯一指定物体的方向。正好三个,不多也不少。不管它们是什么,只要它们都不能用其他术语来表达。可以通过多种方式指定 3D 旋转。最常用的方法是:
让我们仔细看看您的问题。你有一个方向 vector ,你想用它来确定圆柱体的方向。本质上,您只有两个独立的参数,因为方向 vector 的长度无关紧要(为简单起见,让它成为一个单位 vector )。所以你不能只从方向 vector 获得旋转,因为会有一个任意参数。
从仅包含两个独立参数的输入中获取三个未知的独立参数是不可能的。需要一些额外的约束。通常它是一个向上 vector 。附加约束将三个未知的独立参数转换为相关参数。
我建议您使用 glm::orientation从方向 vector 和向上 vector 的输入构建方向矩阵的函数。
至于偏航角、俯仰角和横滚角,您可以从指定的 SDK 函数中获取。此功能不会以您尝试使用它们的方式工作。您应该指定一个向上 vector 。例如,让我们考虑一下,向上 vector 是 y 轴的方向。这意味着,滚动角将始终为零。您应该像以前一样计算偏航角。所以:
float yaw = std::atan2(x, -z);
俯仰角将是 std::atan2(y, -z),但在旋转的框架中,而不是在原始框架中。您应该将俯仰角视为方向 vector 在 x-z 平面上的投影长度与其在 y 轴上的投影之比的反正切。我的意思是:
float projectionLength = std::sqrt(x * x + z * z);
float pitch = std::atan2(y, projectionLength);
构建变换矩阵时,应首先应用适合俯仰角的旋转,然后应用适合偏航旋转的旋转,然后是平移。
参见 this有关 Tait-Bryan 角的更多信息
此外,您应该意识到旋转不可交换的事实。这意味着您应该按照严格的顺序执行轮换。 Tait-Bryan 角的旋转轴有六种可能,称为约定。这些约定取决于执行旋转所围绕的轴。
关于c++ - 偏航、俯仰和滚动到 glm::rotate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26555040/
我现在没有 iPhone 4,我正在尝试找到一个文档来显示偏航、俯仰和滚动的范围以及设备的相应位置。 我知道加速度计的变化范围是 -1 到 +1,但昨天在我的 iPhone 上进行的测试显示,横滚的变
我有两个不同的系统(引擎 A、引擎 B)。引擎 A(运动跟踪软件)生成(偏航、俯仰、横滚),引擎 B(Cinema 4D)期望(航向、俯仰、倾斜)。 我的研究得出的结果是这两个系统之间没有区别。 Ya
如何通过 Quartz 以编程方式将矩形从正面朝上(在 2D 中显示为线)设置为全高? 以下(请原谅粗略的绘图)是我想要得到的:一副卡片(线),卡片旋转到全高。我没有任何调整视角的方法。 可能的作案手
我想找出 iPad 1 上的俯仰、偏航和滚动。由于没有 deviceMotion 工具,我可以从加速度计中获取这些数据吗?我假设我可以使用它返回的向量与引用向量(即重力)进行比较。 iOS 会检测设备
我在 WorldWind 中有一个 3D 飞机模型,这是一个在 OpenGL Java 上运行的 3D 地球模型。我使用数据库中的数据(包括纬度、经度和替代度)更新此模型的位置。如何从当前位置获取航向
我将 Cesium 的一个模型加载到场景中,我有两个点要用来计算模型的方向,这是我创建的函数。 // calculate the direction which the model is facing
几个小时以来,我一直在努力解决这个问题,但我根本想不出一个解决方案:我想要实现的是将方向 vector 转换为 3 glm::rotation调用。 我有一个位于 (0, 0, 0) 的圆柱体,具有一
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我正在使用 CMMotionManger 通过以下代码获取偏航读数。无论 UIInterfaceOrientation 如何,如果向右偏航 90 度,我都会尝试获取负 1.5708 rad 的读数;如
我有一个基于提供的纬度/经度坐标、缩放、偏航和俯仰的谷歌地图和街景。我需要调用一个 javascript 来为每个值更新一个隐藏字段,每当任何细节从它们的默认值发生变化或当一个按钮被点击时。 因此,无
我有一个 CMRotationMatrix *rot,我想从矩阵中获取俯仰、偏航和滚动。我有什么想法可以做到这一点吗? 谢谢 最佳答案 使用四元数比使用欧拉角更好....滚转、俯仰和偏航值可以使用以下
在 Android 中,我可以使用 GAME_ROTATION_VECTOR 传感器获取设备的偏航、滚动和俯仰。 我需要在 Flutter 中做同样的事情,但除了 sensors 之外我找不到任何东西
如何通过 Eigen 库使用俯仰、偏航、滚动创建旋转矩阵? 最佳答案 鉴于我无法找到执行此操作的预构建函数,我构建了一个,以防将来有人发现此问题 Eigen::AngleAxisd rollAngle
我已经研究了一段时间,现在我必须决定走哪条路。 矿山要求:需要知道设备相对于真实航向(地理北极,而非磁极)的方向。为此,我必须使用指南针,现在我必须决定其他的东西,加速度计或陀螺仪。 因为这对我来说是
我的问题 我想用 3x3 旋转矩阵旋转一个 mayavi.mlab.imshow 对象。我能找到的唯一旋转此对象的方法是将对象的 actor.orientation 设置为 [pitch, roll,
我是一名优秀的程序员,十分优秀!