Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vector 按距离单位(而不是3.js中的因子)对2矢量3进行线性插值_Vector_Three.js_Interpolation - Fatal编程技术网

Vector 按距离单位(而不是3.js中的因子)对2矢量3进行线性插值

Vector 按距离单位(而不是3.js中的因子)对2矢量3进行线性插值,vector,three.js,interpolation,Vector,Three.js,Interpolation,对于任何措辞和不正确的引用,我深表歉意,三维数学对我来说是全新的 问题: 我在3D空间中有两点A:(1,2,3)和B:(6,5,4) 我有一段距离L:10 在L的单元处,定义为A向B的3D点C是什么 注: L的距离不是a或B之间距离的一个因素,这里。lerp()不是合适的工具 L可以大于或小于A和B之间的距离 我使用的是THREE.js,但是欢迎使用任何语言示例 迄今为止的工作情况: 计算A和B之间的距离->D 获取与目标值L->R相关的D系数 使用因子R将.lerp()与A一起应用于

对于任何措辞和不正确的引用,我深表歉意,三维数学对我来说是全新的

问题:

  • 我在3D空间中有两点A
    (1,2,3)
    B
    (6,5,4)
  • 我有一段距离L:10
  • L单元处,定义为A向B的3D点C是什么
注:

  • L的距离不是a或B之间距离的一个因素,这里
    。lerp()
    不是合适的工具
  • L可以大于或小于A和B之间的距离
我使用的是
THREE.js
,但是欢迎使用任何语言示例

迄今为止的工作情况:

  • 计算A和B之间的距离->D
  • 获取与目标值L->R相关的D系数
  • 使用因子R将.lerp()与A一起应用于B

您可以通过提供的方法实现这一点

  • 首先你可以减去vecB-vecA得到一个平行向量,它起源于(0,0,0)
  • 其次,使用
    normalize()
    将此向量转换为“单位向量”,这意味着无论它指向哪个方向,其长度始终为1
  • 第三,将向量乘以L,因此
    length=1*L
  • 最后,使用
    +vecA
    将此新平行向量移回其初始位置,以获得最终位置。它将降落在AB创建的线段的内部或外部
var-vecA=new-THREE.Vector3(1,2,3);
var vecB=新的三个向量3(6,5,4);
var L=10;
//创建新向量
变量方向=新的三个向量3();
//分配位置B
指示。副本(vecB);
//减去位置a得到从(0,0,0)开始的向量
指导小组(vecA);
//规格化以获得长度=1的向量
方向。规范化();
//乘以新长度
方向。多重刻度(L);
//添加位置A以将向量返回初始起点
方向。添加(vecA);
//输出到日志以查看结果
console.log(direction.toArray())

谢谢,我刚才通过使用
.lerp()
扩展了工作,但传入了一个比率值,例如:

function lerpUnit (vectorA, vectorB, intendedDistance ) {
   const aToBDistance = vectorA.distanceTo(vectorB)
   const adjustedFactor = intendedDistance / aToBDistance
   return new THREE.Vector3().lerpVectors(vectorA, vectorB, adjustedFactor)
}

或1行:
const vectorC=new THREE.Vector3().lerpVectors(vectorA,vectorB,intendedDistance/vectorA.distanceTo(vectorB))

一行:
var C=new THREE.Vector3().copy(vecA).addScaledVector(new THREE.Vector3().subVectors(vecB,vecA).normalize(),L):)
function lerpUnit (vectorA, vectorB, intendedDistance ) {
   const aToBDistance = vectorA.distanceTo(vectorB)
   const adjustedFactor = intendedDistance / aToBDistance
   return new THREE.Vector3().lerpVectors(vectorA, vectorB, adjustedFactor)
}