当前位置: 首页 > 知识库问答 >
问题:

如何确保随机生成的速度矢量在有效弧线内向前移动相机?

东深
2023-03-14

我使用xy的随机坐标,并设置z=0在场景中生成一个相机,并调整相机的方向,使其看起来像点(0,0,0)。我的目标是使用地面上随机生成的速度矢量向前移动相机(因此z保持0)。我想确保相机向前移动后的新位置在有效范围内,以相对于当前焦点/方向的度数定义。更具体地说,我确定“有效范围”的方法是确保新位置位于旧相机焦点的45度范围内(左45度,右45度)。有人能为我如何实现这一点写一个伪代码吗?

以下是我的尝试,但这似乎不是帮助我实现目标的正确方法:

camera_dir = (0, 0, 0) - current_cam_pos
while True:
    vel_vec=[uniform(-max_vel, max_vel), uniform(-max_vel, max_vel)] # generate a random velocity vector
    new_pos = camera_dir + vel_vec # compute a new position (and camera direction vector) for the camera
    if (compute_angle(new_pos, camera_dir) < 45 or compute_angle(new_pos, camera_dir) > 315):
        break 

共有1个答案

邓毅
2023-03-14

你可以使用:

// 45° in rad
double validAngle = Math.PI / 4;

ThreadLocalRandom random = ThreadLocalRandom.current();

Vector2D camPosition = new Vector2D(0, -1);
Vector2D camTarget= new Vector2D(0, 0);
Vector2D camDirection = camTarget.subtract(camPosition).normalize();

double cosPhi = camDirection.x;
double phi = Math.acos(cosPhi);
double alpha = random.nextDouble(-validAngle, validAngle);
double angle = phi + alpha;

Vector2D velocity = new Vector2D(Math.cos(angle), Math.sin(angle)).multiply(speed);
Vector2D newPosition = position.add(velocity.multiply(deltaTime));

这种方法是用Java编写的,但应该可以移植到其他语言。

然而,我不认为这是一个完美的解决方案,因为这种方法使用了大量的三角函数,在游戏中,你必须在每一帧更新相机,这可能是昂贵的。

该方法使用凸轮方向和x轴之间的角度以及计算最终矢量所允许的最大角度。首先,我计算凸轮方向和x轴之间的夹角的余弦,并将其命名为phi。φ的余弦为:camDirection。点积(新向量2D(1,0)) ,是凸轮方向的x分量。假设你的凸轮方向是(0,1),也就是y轴。那么phi是90°。现在你只需生成一个介于-45°和45°之间的随机数(用rad转换),并将这个角度alpha添加到phi。产生的角度将在相对于x轴的[135°;45°]范围内。现在你有了一个相对于x轴的角度,并用(cos(角度),sin(角度))计算2D向量。您可以使用以下方法测试生成的方向向量是否处于该最大允许角度:

Vector2D newDirection = new Vector2D(Math.cos(angle), Math.sin(angle));

double cosBeta = newDirection.dotProduct(camDirection);
double beta = Math.acos(cosBeta);

感谢您指出的方向。点积(新向量2D(1,0)) 表示相机方向的x分量。我改了。:)

 类似资料:
  • 我试图生成一个具有以下特征的整数随机向量: 我想在每个区间生成不同数量的值,每个区间必须只有唯一的值。我以为是randperm,但我不能定义最小和最大间隔,例如V1 V2,我会得到下面的向量,其中

  • 这是我的代码: null null 因此,一般来说,我想生成一个随机数量的divs和随机的位置。 不幸的是,这篇或这篇文章对我没有帮助。太具体了。 我会非常感谢你的帮助!

  • 我想做的是从我的相机中投射光线。我知道相机的x、y和z坐标,以及它的俯仰和偏航。我需要计算它的方向向量,这样我就可以把它传递给光线跟踪算法。 相机的向上向量是(0,1,0)。“音高”,从相机的角度来看,是上下看。 (我宁愿不使用矩阵,但如果有必要,我会使用)

  • 我正在做一个粒子在晶格中运动的随机行走模拟。因此,我必须创建大量的随机数,大约10^12及以上。目前,我正在使用C 11提供的可能性 问题是:我能做些什么来减少生成这些数字所需的CPU时间,以及对它们的质量有什么影响? 如您所见,我尝试了不同的引擎,但这对CPU时间没有太大影响。此外,我的uniform01(gen)和generate\u canonical之间有什么区别 编辑:通过阅读答案,我得

  • 问题内容: 假设我需要一个3位数的电话号码,因此它类似于: 问题答案: 要获得一个随机的3位数字: (假设您实际上是指三位数,而不是“最多三位数”。) 要使用任意数量的数字: 输出:

  • 问题内容: 我有两个如下的双打 使用随机生成器,我需要在min和max范围之间创建一个双精度值。 但是这里没有什么可以指定范围的。 问题答案: 在Java 7发行之前曾问过这个问题,但是现在,还有另一种使用Java 7(及更高版本)API的可能方式: 将返回介于最小值(包含)和最大值(不含)之间的伪随机双精度值。范围不一定是,可以是。