three.js 提示和技巧的大全!
初学者!为什么我什么都看不到?
您已经遵循了几个基本教程,一切都很顺利。现在,您正在创建自己的应用程序,并且已经完全按照教程中所述设置了所有内容。但你就是什么也看不到!什么?? 您可以采取以下措施来帮助找出问题。
- 检查浏览器控制台是否有错误消息
但你已经这样做了,对吧?
- 将背景颜色设置为黑色以外的颜色
盯着黑色画布?如果你能看到的只是黑色,就很难判断是否发生了什么事情。尝试将背景颜色设置为红色:
import { Color } from "./vendor/three/build/three.module.js";
scene.background = new Color("red");
如果你得到一个红色的画布,那么至少你的 renderer.render 调用是有效的,你可以继续找出还有什么问题。
- 确保场景中有光源,并且它正在照亮您的对象
就像在现实世界中一样,three.js 中的大多数材质都需要光线才能看到。
- 使用 MeshBasicMaterial# 覆盖场景中的所有材质
一种不需要光线可见的材质是 MeshBasicMaterial。如果您在显示对象时遇到问题,您可以使用 MeshBasicMaterial 基础网格材质 临时覆盖场景中的所有材质。如果在执行此操作时对象神奇地出现,那么您的问题是缺乏光线。
import { MeshBasicMaterial } from "./vendor/three/build/three.module.js";
scene.overrideMaterial = new MeshBasicMaterial({ color: "green" });
- 您的物体是否在摄像机的 视锥体 viewing frustum 范围内?
如果您的对象不在视锥体内,它将被裁剪。尝试将远裁剪平面做得非常大:
camera.far = 100000;
camera.updateProjectionMatrix();
请记住,这只是为了测试!摄像机的视锥体以米为单位,您应该使其尽可能小以获得最佳性能。设置场景并正常工作后,请尽可能减小视锥体的大小。
- 您的相机是否在物体内?
默认情况下,所有内容都在 点 (0,0,0) (也就是源) 创建。确保您已将摄像机向后移动,以便您可以看到您的场景!
camera.position.z = 10;
- 仔细考虑场景的规模
尝试可视化您的场景,并记住 three.js 中的 1 个单位是 1 米。一切都以合理的逻辑方式组合在一起吗?或者,也许您什么都看不到,因为您刚刚加载的对象只有 0.00001 米宽。等等,屏幕中间的那个小黑点是什么?
一般提示
-
在 JavaScript 中创建对象的成本很高,因此不要在循环中创建对象。相反,创建一个对象(例如 Vector3),并使用 vector.set() 或类似方法在循环中重用 that。
-
渲染循环也是如此。为了确保您的应用以每秒 60 帧的速度运行,请在渲染循环中尽可能少地执行工作。不要每帧都创建新对象。
-
始终使用 BufferGeometry 而不是 Geometry,这样更快。
-
预构建的对象也是如此,请始终使用缓冲区几何版本( BoxBufferGeometry 而不是 BoxGeometry)。
-
始终尝试重用对象,例如对象、材质、纹理等(尽管更新某些内容可能比创建新内容慢,请参阅下面的纹理提示)。