Vector 稍微旋转一个向量3D

Vector 稍微旋转一个向量3D,vector,3d,rotation,Vector,3d,Rotation,所以我有一个3d向量(Javascript+Three.js,但这并不重要,因为这不依赖于语言),我想在随机方向上稍微旋转它。 背景是,我想在3d射击游戏中使用一个随机武器,因此我有一个玩家瞄准的向量,但需要在随机方向上以最大角度稍微旋转它。你可以在你的方向(dir)定义的平面上计算偏移向量,将其添加到dir,然后进行规格化以获得新方向 如果您可以假设您的dir向量从不向上(假设y向上),则可以执行类似的操作(某些函数由以下函数组成): var yAxis=新的3.Vector3(0.0,1.0

所以我有一个3d向量(Javascript+Three.js,但这并不重要,因为这不依赖于语言),我想在随机方向上稍微旋转它。 背景是,我想在3d射击游戏中使用一个随机武器,因此我有一个玩家瞄准的向量,但需要在随机方向上以最大角度稍微旋转它。

你可以在你的方向(
dir
)定义的平面上计算偏移向量,将其添加到
dir
,然后进行规格化以获得新方向

如果您可以假设您的
dir
向量从不向上(假设y向上),则可以执行类似的操作(某些函数由以下函数组成):

var yAxis=新的3.Vector3(0.0,1.0,0.0);
var dir=新的三个向量3(…);
dir.normalize();
//定义与“dir”正交的平面的向量。
var-side=new-THREE.Vector3();
var up=new-THREE.Vector3();
//这将给出一个与“dir”和“yAxis”正交的向量。
侧交叉向量(dir,yAxis);
侧。正常化();
//这将给出一个与“dir”和“side”正交的向量。
//这表示“dir”的向上方向。
向上。交叉向量(侧,方向);
up.normalize();
//最大位移角。
var角度=弧度(45.0);
//创建表示正交平面中偏移的随机二维向量
//转到“dir”。
//或者,您可以绘制一个随机角度0/2pi并计算sin/cos。
var delta=新的三个向量2(兰德(-1.0,1.0),兰德(-1.0,1.0));
delta.normalize();
delta.multilyscalar(数学tan(角度));
//“side”和“up”定义了一个与“dir”正交的平面,所以我们在这里创建
//偏移向量的三维版本。
侧面多重标度(δx);
上倍率标度(δy);
//定义新的方向,方法是将“dir”与
//侧面/上平面。
var newDir=new-THREE.Vector3(dir.x,dir.y,dir.z);
新目录添加(侧);
newDir.add(向上);
newDir.normalize();
//只需检查“dir”和“newDir”之间的角度是否与
//被选中的一个。
log(Math.acos(dir.dot(newDir))/Math.PI*180.0);
如果
dir
也可以指向上,则需要单独使用
dir
生成
side
up

希望这有帮助