缩放非均匀导致错误导入的顶点法线

时间:2017-08-26 02:55:40

标签: three.js

情景:

一个。我在3ds max中有一个默认球体

湾我将它在X轴上缩小10次然后导出到obj。

℃。将缩小的球体导入3JS,然后再将X放大10倍。

d。我希望球体看起来像步骤A - 在缩小之前 - 我需要保持导入的顶点法线,而不是在3JS中计算

____

问题:

  • 即使在按比例放大后,球体仍然具有与导入时相同的顶点法线,导入的顶点法线不会通过在3JS中缩放而更新,因此对球体的照明效果看起来不再正确。请看这些jsFiddle以了解我在说什么:

JsFiddle演示:

  1. 在Max缩小并在3JS中放大,导致错误的法线:http://jsfiddle.net/uury1jtt/5/
  2. 来自Max的默认球体,没有缩放任何东西,没有问题,仅用于演示正确的顶点法线应该是什么样的:http://jsfiddle.net/uury1jtt/4/
  3. enter image description here (球体只是为了简化样品,通常它可以是任何网格)

    原因:

    我想缩放非制服进口网格以重复使用不同形状

    请提出一些有关如何摆脱此问题的建议?非常感谢每一个想法!

1 个答案:

答案 0 :(得分:1)

那是因为你的法线都在x方向上被压扁了。你必须深入研究BufferGeometry的属性并手动“拉伸”这些法线:

尝试使用以下代码替换JSFiddle中的onclick回调:

document.getElementById("scaleButton").onclick = function(){
    object.scale.set(10,1,1);

    // Get the 'normal' attribute of the geometry
    var normals = object.children[0].geometry.getAttribute("normal");

    // Manually stretch the x-value of the normal by 10
    for(var i3 = 0; i3 < normals.length; i3 +=3){
        normals.array[i3] = normals.array[i3] * 10;
    }

    // Inform the renderer that the attribute was altered
    normals.needsUpdate = true;
}

Working JSFiddle