当摄像机旋转时,2d屏幕速度到3d世界速度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当摄像机旋转时,2d屏幕速度到3d世界速度相关的知识,希望对你有一定的参考价值。

我正在创建一个小型演示游戏,您可以围绕地球旋转并将卫星发射到太空。但是我的计算有些麻烦。

您可以将鼠标从平台拖动到某个方向。这是你射击卫星的方向。因为相机围绕行星旋转,所以向上与向前不同。对于卫星的方向,我需要一个Vector3(方向/速度)。

所以我拥有的数据是屏幕上的平台前移和鼠标拖动方向。

enter image description here所以当用户将其拖动到(-0.7,0.7)时,这意味着satilatie的发射方向应为(0,0,1)。全球/世界前进方向。

那么我该如何将这些2d屏幕位置和方向转换为世界方向?

答案

PlayCanvas有一个非常有用的功能,我们可以使用。 implementation如下:

 * @description Convert a point from 2D canvas pixel space to 3D world space.
 * @param {Number} x x coordinate on PlayCanvas' canvas element.
 * @param {Number} y y coordinate on PlayCanvas' canvas element.
 * @param {Number} z The distance from the camera in world space to create the new point.
 * @param {Number} cw The width of PlayCanvas' canvas element.
 * @param {Number} ch The height of PlayCanvas' canvas element.
 * @param {pc.Vec3} [worldCoord] 3D vector to receive world coordinate result.
 * @returns {pc.Vec3} The world space coordinate.
 */
screenToWorld: function (x, y, z, cw, ch, worldCoord) {
  ...

我们可以使用此函数将鼠标拖动线的起点和终点(图中的AB)转换为世界空间中的3D线。转换后,我们必须从两个投影点中减去相机的世界位置,并对结果矢量进行标准化。

[z参数与此目的无关,因为我们只对方向向量而不是实际点感兴趣,所以只需将其设置为例如1.]

那么这给了我们什么呢?这两个向量跨越的平面:

enter image description here

速度方向必须满足三个标准:

  • 垂直于发射场地的表面法线(即与表面相切)。
  • 与我们刚刚找到的飞机平行。
  • 从A到B的方向有一个组件。

让:

  • 屏幕点AB分别投射到定向向量UV
  • 发射场的表面法线(站在那里的人看到的“向上”方向)是Nenter image description here 哪里(ψ, φ) = (lat, long)

最后,(非标准化)速度方向由cross(N, cross(A, B))简单给出。请注意,操作顺序很重要。

想象一下:

enter image description here

编辑:

  1. 第二张图中的小错误:U×V应该是V×U,但预期结果N×(U×V)仍然是正确的。
  2. 请注意,UxV不一定与N垂直。当它与N平行时,蓝色平面“刮擦”表面,即绿色线AB与发射现场在屏幕上呈现的地球表面相切。

以上是关于当摄像机旋转时,2d屏幕速度到3d世界速度的主要内容,如果未能解决你的问题,请参考以下文章

转载3D/2D中的D3DXMatrixPerspectiveFovLH和D3DXMatrixOrthoLH投影函数详解

将 2d 屏幕位置投影到 3d 世界空间中

OpenGL - 在 3D 世界的屏幕上固定位置打印 2D 文本

使用 UIRotationGestureRecognizer Cocos2D-iPhone CCSprite 旋转速度非常快

将 3D 位置转换为 2d 屏幕位置 [r69!]

OpenGL相机旋转怪异