经纬志
首页 / three.js / API 文档

Vector2

先看结论

二维向量,主要出现在屏幕坐标、归一化设备坐标与纹理 UV 中。

最后验证 2026-11-03 · three.js 0.160.0 · 更新 2026-10-28 · 引用本文
new THREE.Vector2(x, y) → Vector2

构造参数

参数默认说明
x0横向分量,在 UV 中对应右方向
y0纵向分量,在 UV 中对应上方向

属性

属性说明
x / y两个分量,可直接读写
isVector2只读标记

常用方法

方法说明
set(x, y) / setScalar(s)赋值,两个分量相同可用后者
copy(v) / clone()就地复制与新建副本
add(v) / sub(v) / multiply(v)逐分量加减乘,均就地改写
addScaledVector(v, s)加上 v * s,插值迭代时很实用
multiplyScalar(s) / divideScalar(s)标量乘除
dot(v) / cross(v)点积返回数值,二维叉积返回标量(有符号面积)
length() / lengthSq() / normalize()模长、模长平方、单位化
distanceTo(v) / distanceToSquared(v)两点距离
angle()相对 +X 轴的极角,范围 −π 到 π
rotateAround(center, angle)绕指定点旋转,就地改写
lerp(v, t) / lerpVectors(a, b, t)线性插值
clamp(min, max) / clampLength(min, max)限制分量范围或模长范围
applyMatrix3(m)乘 3×3 矩阵,UV 变换时使用
fromArray(arr, offset) / toArray(arr, offset)与普通数组或类型化数组互转
equals(v)逐分量严格比较

指针位置转设备坐标

Raycaster.setFromCamera 需要的是归一化设备坐标:左下角为 (-1, -1), 右上角为 (1, 1),与浏览器的屏幕坐标原点在左上角相反,因此 Y 要翻转。

const pointer = new THREE.Vector2();

function onPointerMove(event) {
  const rect = renderer.domElement.getBoundingClientRect();

  pointer.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;
  pointer.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;
}

renderer.domElement.addEventListener('pointermove', onPointerMove);

用 getBoundingClientRect() 而不是 clientWidth, 是因为画布可能被 CSS 缩放过,或页面上有滚动偏移。设备像素比不需要参与换算。

UV 与贴图坐标

几何体的 uv 属性是二维数组,原点在纹理左下角, (0, 0) 对应左下,(1, 1) 对应右上。 做贴图平铺时,通过 texture.repeat 与 texture.offset 调整,而不是改 UV:

texture.wrapS = THREE.RepeatWrapping;
texture.wrapT = THREE.RepeatWrapping;
texture.repeat.set(8, 8);   // 覆盖 8 × 8 次
texture.offset.set(0.5, 0);

如果要让一个面上的贴图独立旋转,可以用 texture.center 配合 texture.rotation,两者的单位都是弧度与 UV 空间。

Y 轴方向是常见错误来源。屏幕坐标向下为正,UV 与设备坐标向上为正。 指针换算漏掉负号时,拾取结果会上下镜像,而画面本身完全正常,排查时容易误判为几何问题。

换算由使用方负责。Vector2 只是两个数字, three.js 不提供经纬度、投影坐标与屏幕坐标之间的转换。

引用本文

经纬志(2026)。《Vector2》。https://www.jingweizhi.com/three/api/vector2.html(访问日期 2026-11-03)。