【发布时间】:2014-07-29 04:41:27
【问题描述】:
您好,我已经为我的 3D 对象创建了简单的渲染器(php 生成)。
我已成功渲染所有对象,但我在纹理方面遇到了一些大问题。
这是我的纹理:(512x512)
我想在我的对象上使用它,但是会发生这种情况:
我不知道如何以 1:1 的比例显示未拉伸的漂亮网格。
我想我需要以某种方式计算重复次数。有什么想法吗?
这就是我设置纹理的方式:
var texture = THREE.ImageUtils.loadTexture(basePath + '/images/textures/dt.jpg', new THREE.UVMapping());
texture.wrapT = THREE.RepeatWrapping;
texture.wrapS = THREE.RepeatWrapping;
texture.repeat.set(1,1);
stairmaterials[0] = new THREE.MeshBasicMaterial(
{
side: THREE.DoubleSide,
map: texture
});
我尝试更改重复值以实现 1:1 而非拉伸配给,但我根本没有成功。我都变得越来越糟了。
我还使用以下算法来计算顶点 UVS:
geom.computeBoundingBox();
var max = geom.boundingBox.max;
var min = geom.boundingBox.min;
var offset = new THREE.Vector2(0 - min.x, 0 - min.z);
var range = new THREE.Vector2(max.x - min.x, max.z - min.z);
geom.faceVertexUvs[0] = [];
var faces = geom.faces;
for (i = 0; i < geom.faces.length; i++) {
var v1 = geom.vertices[faces[i].a];
var v2 = geom.vertices[faces[i].b];
var v3 = geom.vertices[faces[i].c];
geom.faceVertexUvs[0].push([
new THREE.Vector2(( v1.x + offset.x ) / range.x, ( v1.z + offset.z ) / range.z),
new THREE.Vector2(( v2.x + offset.x ) / range.x, ( v2.z + offset.z ) / range.z),
new THREE.Vector2(( v3.x + offset.x ) / range.x, ( v3.z + offset.z ) / range.z)
]);
}
geom.uvsNeedUpdate = true;
【问题讨论】:
-
你的 UV 可以大于 1——它们只会包裹。考虑将 UV 设置为随每个面的尺寸缩放。这样就不会有拉伸。然后使用
texture.repeat放大你的纹理。 -
谢谢。我会尝试,但我不确定我是否理解“考虑将 UV 设置为与每个面的尺寸成比例。这样就不会有拉伸。”正确。
-
例如,如果一个大小为 width x height 的矩形面由两个三角形组成,则一个三角形的 UV 可能是 (0, 0)、(width, 0) 和 (width, height)。
标签: javascript three.js