详细说说Three.js三维坐标系和光源对物体表面影响

坐标系规则(右手坐标系)

three.js遵循右手笛卡尔坐标系

  • X 轴 :水平 向右 为正
  • Y 轴 :垂直 向上 为正
  • Z 轴向外(朝向屏幕你) 为正,向里(远离你) 为负

位置控制(position)

所有模型,相机,灯光都有position

javascript 复制代码
obj.position.x = 1;
obj.position.y = 2;
obj.position.z = 3;

// 简写
obj.position.set(1, 2, 3);

旋转控制

javascript 复制代码
// 绕 X / Y / Z 轴旋转
obj.rotation.x = Math.PI / 4;
obj.rotation.set(Math.PI/4, Math.PI/2, 0);

缩放(scale)

java 复制代码
obj.scale.set(1.5, 1.5, 1.5);

辅助坐标系

直接在场景画出 X/Y/Z 三色轴:

  • 红色:X
  • 绿色:Y
  • 蓝色:Z
javascript 复制代码
// 长度 5
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);

材质与光源基础关系

两种材质的本质区别

MeshBasicMaterial :不受任何光源影响,永远纯色,无阴暗,无阴影,适合文字,UI,不需要光影的物体;

MeshLambertMaterial / MeshPhongMaterial / MeshStandardMaterial必须有光源 才会显示明暗、立体感,靠法线 + 光线角度 计算表面亮度,大屏、模型、实景渲染必用

光源影响物体表面的原理

物体每个面都有法线(垂直表面的方向)

  • 光线正对着表面 → 最亮
  • 光线斜着照 → 变暗
  • 光线背面 → 全黑
  • 多光源叠加 = 混合亮度

Three.js 五大常用光源 详细作用

1.环境光AmbientLight

漫反射全局光,

  • 无方向、无阴影
  • 给整个场景打底亮度,不会死黑
  • 不能单独用,物体没立体感
javascript 复制代码
const ambient = new THREE.AmbientLight(0xffffff, 0.3);
scene.add(ambient);

2. 平行光 DirectionalLight

模拟太阳光

  • 光线平行、有方向
  • 可以产生阴影
  • 适合整体日照、大屏地图打光
javascript 复制代码
const dirLight = new THREE.DirectionalLight(0xffffff, 1);
dirLight.position.set(5, 10, 7);
// 开启阴影
dirLight.castShadow = true;
scene.add(dirLight);

3. 点光源 PointLight

模拟灯泡、路灯

  • 向四面八方发散
  • 距离越远越暗
  • 可产生阴影
javascript 复制代码
const pointLight = new THREE.PointLight(0xffaa00, 1, 20);
pointLight.position.set(0, 3, 0);
scene.add(pointLight);

4. 聚光灯 SpotLight

模拟手电筒、舞台射灯

  • 锥形照射范围
  • 有聚焦、有边缘衰减
javascript 复制代码
const spotLight = new THREE.SpotLight(0xffffff, 1);
spotLight.position.set(0, 5, 0);
scene.add(spotLight);

5. 半球光 HemisphereLight

模拟天空 + 地面环境渐变

  • 上方天光、下方地面反光
  • 柔和自然,无阴影
javascript 复制代码
const hemiLight = new THREE.HemisphereLight(0x87ceeb, 0x333333, 0.6);
scene.add(hemiLight);

光源阴影必备配置

想要物体有投影、地面有影子,必须开:

javascript 复制代码
// 渲染器开启阴影
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap; // 柔和阴影

// 灯光开启投射阴影
dirLight.castShadow = true;

// 模型允许投射阴影
cube.castShadow = true;

// 地面接收阴影
plane.receiveShadow = true;
相关推荐
最爱老式锅包肉17 小时前
HarmonyOS技术精讲-Camera Kit(相机服务)第9篇:自动对焦与手动调焦
数码相机·华为·harmonyos
最爱老式锅包肉20 小时前
HarmonyOS技术精讲-Camera Kit(相机服务)第8篇:曝光控制深入解析
数码相机·华为·harmonyos
气概21 小时前
QT集成basler相机
开发语言·数码相机·qt
线束线缆组件品替网2 天前
Amphenol ICC RJE1Y22610C42401线束组件应用解析
网络·数码相机·智能手机·计算机外设·电脑·电视盒子
LongtengGensSupreme2 天前
C#图像内存高速拷贝:使用Marshal.AllocHGlobal与ArrayPool实现内存拷贝的几个方法
开发语言·数码相机·c#
、我是男生。2 天前
激光切割机——相机焦点——激光焦点
数码相机
最爱老式锅包肉2 天前
HarmonyOS技术精讲-Camera Kit(相机服务)第3篇:实现相机预览功能
数码相机·华为·harmonyos
是摆烂第一名呀2 天前
RK3576+GMSL摄像头底层适配与调试
linux·arm开发·驱动开发·嵌入式硬件·数码相机
wuhanzhanhui2 天前
从 3D 建模到高光谱2026 武汉机器视觉展会|工业相机展会洞见感知力量新高度
数码相机·3d
m0_617493943 天前
Python OpenCV 亚像素角点检测(cornerSubPix)详解与实战
python·数码相机·opencv