【发布时间】:2018-07-31 23:13:52
【问题描述】:
我想使用一个将 thetaLength 设置为 -6.3 的“倒置”圆柱体,以便将内部归类为 FrontSide,这样该圆柱体就可以进入另一个顶部和底部都有环的普通圆柱体,形成一个管。
我想做这一切的原因是为了让整个对象可以用一种材料组合成一个网格。如果您不将 thetaLength 设置为负数,则必须将侧面设置为 BackSide 的重复材质,因此您不能将其全部作为一个网格。
我已经完成了我在下面的示例中所说的内容(您可以使用鼠标进行缩放和移动)。负的θ圆柱在左边,正常的在右边。
我遇到的问题是,您可以看到左侧的圆柱体(内部)比右侧的要暗得多。右边的看起来更逼真。
我在想可能是因为它认为光线来自与实际来自不同的方向。
有什么办法可以解决这个问题,让倒置的圆柱体看起来像背面的圆柱体,这样我就可以将这样的管子作为一个单一的网格?
width = window.innerWidth
height = window.innerHeight
renderer = new THREE.WebGLRenderer({antialias: true})
renderer.setClearColor(0x8e8ed7)
renderer.setPixelRatio(window.devicePixelRatio)
renderer.setSize(width, height)
document.body.appendChild(renderer.domElement)
scene = new THREE.Scene()
camera = new THREE.PerspectiveCamera(35, width / height, 0.1, 3000)
camera.position.set(0, 50, 100)
controls = new THREE.OrbitControls(camera)
controls.minDistance = 40
controls.maxDistance = 1300
scene.add(camera, new THREE.AmbientLight(0xffffff, 0.48))
light = new THREE.PointLight(0xffffff, 0.55)
light.position.copy( camera.position );
light.position.y -= 80
light.position.x += 100
camera.add(light)
requestAnimationFrame(function animate(){
requestAnimationFrame(animate)
renderer.render(scene, camera)
})
material = new THREE.MeshPhongMaterial({color: 0xFF7E14, specular: 0x111111, shininess: 75})
material2= new THREE.MeshPhongMaterial({color: 0xFF7E14, specular: 0x111111, shininess: 75, side: THREE.BackSide})
tube_a = new THREE.Mesh(new THREE.CylinderGeometry(6,6,20,32,1,true,0,-6.3), material)
tube_aa = new THREE.Mesh(new THREE.CylinderGeometry(6,6,20,32,1,true,0,6.3), material2)
tube_b = new THREE.Mesh(new THREE.CylinderGeometry(8.1375,8.1375,20,32,1,true), material)
ring = new THREE.Mesh(new THREE.RingGeometry(6,8.1375,32), material)
group1 = new THREE.Group()
ta1 = tube_a.clone()
group1.add(ta1)
tb1 = tube_b.clone()
group1.add(tb1)
r = ring.clone()
r.position.y -= 10
r.rotateX((9*Math.PI)/18)
group1.add(r)
r = ring.clone()
r.position.y += 10
r.rotateX((27*Math.PI)/18)
group1.add(r)
group1.position.x -= 15
scene.add(group1)
group2 = new THREE.Group()
ta2 = tube_aa.clone()
group2.add(ta2)
tb2 = tube_b.clone()
group2.add(tb2)
r = ring.clone()
r.position.y -= 10
r.rotateX((9*Math.PI)/18)
group2.add(r)
r = ring.clone()
r.position.y += 10
r.rotateX((27*Math.PI)/18)
group2.add(r)
group2.position.x += 15
scene.add(group2)
<script src="http://threejs.org/build/three.min.js"></script>
<script src="http://threejs.org/examples/js/controls/OrbitControls.js"></script>
【问题讨论】:
-
不支持
thetaLength的负值,因为这会导致错误的法线向量。这就是演示中照明错误的原因。你必须调整CylinderGeometry的源代码或者使用建模工具来解决这个问题。我建议后一种选择。 -
原来你可以做
Geometry.computeVertexNormals()。
标签: three.js