【发布时间】:2018-09-26 20:42:39
【问题描述】:
我在项目开发过程中遇到了障碍。我试图在独特尺寸和形状的物体上使用各种类型的 phong 材料来达到一个水平。默认情况下,Three.JS 以一种拉伸方式处理纹理,当呈现在不完全 1:1:1 比例大小的网格上时,它们会变得难以忍受,这意味着一切都必须是立方体或完美大小的球体才能看起来正常.为了避免这个问题,您可以使用重复选项加载纹理。这种方法的问题在于,对于 100 多个不同大小的对象,这些重复选项对于每种材料、每个对象都必须不同。这意味着加载数百个纹理或用克隆填充内存。后者并没有太困扰我。我需要帮助,试图弄清楚如何处理具有独特几何形状和独特颜色贴图、发射贴图、高光贴图、aomaps、凹凸贴图和法线贴图的大量独特对象。如何使具有基于材料的独特重复设置的 1 个纹理变得可行?即使我已经解决了这个问题,我也必须为每种材料重复 5+ 纹理。 5*~100 = ~500 纹理/纹理变化。这是个问题。至少 100 个,最多 800 个。
对此我非常绝望,如果我无法处理批量对象,我正在考虑切换到 Unity 或 UE4。
我愿意从第 1 步开始完全修改我的代码。这没什么特别的,而且非常粗糙。但我想展示我在 THREE.js 中处理对象的方式。这不是我的完整程序(显然),它只是我如何做事的一个例子。
var energyRockMaterial =
new THREE.MeshPhongMaterial(
{
envMap: scene.background,
map: new THREE.TextureLoader().load("energyrock.jpg"),
normalMap: new THREE.TextureLoader().load("energyrocknormal.jpg"),
//bumpMap: new THREE.TextureLoader().load("energyrockbump.jpg"),
aoMap: new THREE.TextureLoader().load("energyrockao.jpg"),
specularMap: new
THREE.TextureLoader().load("energyrockspecular.jpg"),
emissiveMap: new
THREE.TextureLoader().load("energyrockemissive.jpg"),
color:"#ffffff",
emissive:"#bb00bb",
specular:"#000000",
reflectivity:1,
});
var energyRockGeometry = new THREE.BoxBufferGeometry(1,1,1);
var energyRockMesh = new
THREE.Mesh(energyRockGeometry,energyRockMaterial);
scene.add(energyRockMesh)
对有问题的缩进表示歉意,HTML 表单不喜欢我的标签,我不得不把它弄出来。
感谢您的回复。
【问题讨论】:
-
试试这个模式:
mesh.onBeforeRender = function() { this.material.map.repeat.x = this.userData.repeatx; };这样克隆出来的材质可以共享同一个纹理。 -
你的整个场景是由立方体和原始形状组成的吗?还是从外部文件加载模型?
-
我正在使用原始形状,我不打算更改它。
标签: javascript three.js