Fix winding order

This commit is contained in:
Chris Hodapp 2019-09-15 19:43:09 +02:00
parent c8f0216821
commit 7ec628c836
2 changed files with 20 additions and 14 deletions

View File

@ -16,7 +16,7 @@
"metadata": {},
"outputs": [],
"source": [
"c = meshutil.open_cube()"
"c = meshutil.cube(open_xz=True)"
]
},
{
@ -48,7 +48,6 @@
"name": "stderr",
"output_type": "stream",
"text": [
"face_normals didn't match triangles, ignoring!\n",
"/home/hodapp/.local/lib/python3.6/site-packages/IPython/core/display.py:694: UserWarning: Consider using IPython.display.IFrame instead\n",
" warnings.warn(\"Consider using IPython.display.IFrame instead\")\n"
]
@ -248,7 +247,7 @@
"Math.pow(distanceToCamera,2)+\n",
"Math.pow(distanceToCamera,2));camera.position.set(len,len,len);controls.update();camera.lookAt(boundingSphere.center);controls.target.set(boundingSphere.center.x,boundingSphere.center.y,boundingSphere.center.z);camera.updateProjectionMatrix();}\n",
"function centerControls(obj,camera,controls){const boundingBox=new THREE.Box3().setFromObject(obj);const boundingSphere=new THREE.Sphere();boundingBox.getBoundingSphere((target=boundingSphere));controls.update();controls.target.set(boundingSphere.center.x,boundingSphere.center.y,boundingSphere.center.z);}\n",
"function init(){scene=new THREE.Scene();scene.background=new THREE.Color(0xffffff);tracklight=new THREE.DirectionalLight(0xffffff,1.75);scene.add(tracklight);base64_data="Z2xURgIAAABUBAAAeAMAAEpTT057InNjZW5lIjogMCwgInNjZW5lcyI6IFt7Im5vZGVzIjogWzBdfV0sICJhc3NldCI6IHsidmVyc2lvbiI6ICIyLjAiLCAiZ2VuZXJhdG9yIjogImh0dHBzOi8vZ2l0aHViLmNvbS9taWtlZGgvdHJpbWVzaCJ9LCAiYWNjZXNzb3JzIjogW3siYnVmZmVyVmlldyI6IDAsICJjb21wb25lbnRUeXBlIjogNTEyNSwgImNvdW50IjogMjQsICJtYXgiOiBbN10sICJtaW4iOiBbMF0sICJ0eXBlIjogIlNDQUxBUiJ9LCB7ImJ1ZmZlclZpZXciOiAxLCAiY29tcG9uZW50VHlwZSI6IDUxMjYsICJjb3VudCI6IDgsICJ0eXBlIjogIlZFQzMiLCAiYnl0ZU9mZnNldCI6IDAsICJtYXgiOiBbMS4wLCAxLjAsIDEuMF0sICJtaW4iOiBbMC4wLCAwLjAsIDAuMF19XSwgIm1lc2hlcyI6IFt7Im5hbWUiOiAiY3ViZV90ZXN0LnN0bCIsICJwcmltaXRpdmVzIjogW3siYXR0cmlidXRlcyI6IHsiUE9TSVRJT04iOiAxfSwgImluZGljZXMiOiAwLCAibW9kZSI6IDR9XX1dLCAiY2FtZXJhcyI6IFt7Im5hbWUiOiAiY2FtZXJhX05KUlBXWiIsICJ0eXBlIjogInBlcnNwZWN0aXZlIiwgInBlcnNwZWN0aXZlIjogeyJhc3BlY3RSYXRpbyI6IDEuMzMzMzMzMzMzMzMzMzMzMywgInlmb3YiOiAwLjc4NTM5ODE2MzM5NzQ0ODMsICJ6bmVhciI6IDAuMDF9fV0sICJub2RlcyI6IFt7Im5hbWUiOiAid29ybGQiLCAiY2hpbGRyZW4iOiBbMV19LCB7Im5hbWUiOiAiY3ViZV90ZXN0LnN0bF9NNVFBN1JPVjJaRkciLCAibWVzaCI6IDB9XSwgImJ1ZmZlcnMiOiBbeyJieXRlTGVuZ3RoIjogMTkyfV0sICJidWZmZXJWaWV3cyI6IFt7ImJ1ZmZlciI6IDAsICJieXRlT2Zmc2V0IjogMCwgImJ5dGVMZW5ndGgiOiA5Nn0sIHsiYnVmZmVyIjogMCwgImJ5dGVPZmZzZXQiOiA5NiwgImJ5dGVMZW5ndGgiOiA5Nn1dfSDAAAAAQklOAAAAAAAEAAAABgAAAAAAAAAGAAAAAgAAAAQAAAAFAAAABwAAAAQAAAAHAAAAAAAAAAUAAAABAAAAAwAAAAUAAAADAAAAAQAAAAEAAAAAAAAAAgAAAAEAAAACAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAPwAAAAAAAIA/AAAAAAAAAAAAAIA/AACAPwAAgD8AAAAAAAAAAAAAgD8AAAAAAACAPwAAgD8AAIA/AAAAAAAAgD8AAIA/AACAPw==";;renderer=new THREE.WebGLRenderer({antialias:true});renderer.setPixelRatio(window.devicePixelRatio);renderer.setSize(window.innerWidth,window.innerHeight);document.body.appendChild(renderer.domElement);loader=new THREE.GLTFLoader();loader.load("data:text/plain;base64,"+base64_data,function(gltf){scene.add(gltf.scene);camera=gltf.cameras[0];controls=new THREE.TrackballControls(camera);controls.rotateSpeed=1.0;controls.zoomSpeed=1.2;controls.panSpeed=0.8;controls.noZoom=false;controls.noPan=false;controls.staticMoving=true;controls.dynamicDampingFactor=0.3;controls.keys=[65,83,68];controls.addEventListener("change",render);centerControls(scene,camera,controls);render();window.addEventListener("resize",onWindowResize,false);animate();});}\n",
"function init(){scene=new THREE.Scene();scene.background=new THREE.Color(0xffffff);tracklight=new THREE.DirectionalLight(0xffffff,1.75);scene.add(tracklight);base64_data="Z2xURgIAAACIBAAAfAMAAEpTT057InNjZW5lIjogMCwgInNjZW5lcyI6IFt7Im5vZGVzIjogWzBdfV0sICJhc3NldCI6IHsidmVyc2lvbiI6ICIyLjAiLCAiZ2VuZXJhdG9yIjogImh0dHBzOi8vZ2l0aHViLmNvbS9taWtlZGgvdHJpbWVzaCJ9LCAiYWNjZXNzb3JzIjogW3siYnVmZmVyVmlldyI6IDAsICJjb21wb25lbnRUeXBlIjogNTEyNSwgImNvdW50IjogMzYsICJtYXgiOiBbN10sICJtaW4iOiBbMF0sICJ0eXBlIjogIlNDQUxBUiJ9LCB7ImJ1ZmZlclZpZXciOiAxLCAiY29tcG9uZW50VHlwZSI6IDUxMjYsICJjb3VudCI6IDgsICJ0eXBlIjogIlZFQzMiLCAiYnl0ZU9mZnNldCI6IDAsICJtYXgiOiBbMS4wLCAxLjAsIDEuMF0sICJtaW4iOiBbMC4wLCAwLjAsIDAuMF19XSwgIm1lc2hlcyI6IFt7Im5hbWUiOiAiY3ViZV90ZXN0LnN0bCIsICJwcmltaXRpdmVzIjogW3siYXR0cmlidXRlcyI6IHsiUE9TSVRJT04iOiAxfSwgImluZGljZXMiOiAwLCAibW9kZSI6IDR9XX1dLCAiY2FtZXJhcyI6IFt7Im5hbWUiOiAiY2FtZXJhXzlFTzZYNyIsICJ0eXBlIjogInBlcnNwZWN0aXZlIiwgInBlcnNwZWN0aXZlIjogeyJhc3BlY3RSYXRpbyI6IDEuMzMzMzMzMzMzMzMzMzMzMywgInlmb3YiOiAwLjc4NTM5ODE2MzM5NzQ0ODMsICJ6bmVhciI6IDAuMDF9fV0sICJub2RlcyI6IFt7Im5hbWUiOiAid29ybGQiLCAiY2hpbGRyZW4iOiBbMV19LCB7Im5hbWUiOiAiY3ViZV90ZXN0LnN0bF9URVhPN0oyTk5QUVAiLCAibWVzaCI6IDB9XSwgImJ1ZmZlcnMiOiBbeyJieXRlTGVuZ3RoIjogMjQwfV0sICJidWZmZXJWaWV3cyI6IFt7ImJ1ZmZlciI6IDAsICJieXRlT2Zmc2V0IjogMCwgImJ5dGVMZW5ndGgiOiAxNDR9LCB7ImJ1ZmZlciI6IDAsICJieXRlT2Zmc2V0IjogMTQ0LCAiYnl0ZUxlbmd0aCI6IDk2fV19ICAg8AAAAEJJTgAAAAAABgAAAAQAAAAAAAAAAgAAAAYAAAAEAAAABwAAAAUAAAAEAAAABgAAAAcAAAAFAAAAAwAAAAEAAAAFAAAABwAAAAMAAAABAAAAAgAAAAAAAAABAAAAAwAAAAIAAAACAAAABwAAAAYAAAACAAAAAwAAAAcAAAAAAAAABAAAAAUAAAAAAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgD8AAAAAAACAPwAAAAAAAAAAAACAPwAAgD8AAIA/AAAAAAAAAAAAAIA/AAAAAAAAgD8AAIA/AACAPwAAAAAAAIA/AACAPwAAgD8=";;renderer=new THREE.WebGLRenderer({antialias:true});renderer.setPixelRatio(window.devicePixelRatio);renderer.setSize(window.innerWidth,window.innerHeight);document.body.appendChild(renderer.domElement);loader=new THREE.GLTFLoader();loader.load("data:text/plain;base64,"+base64_data,function(gltf){scene.add(gltf.scene);camera=gltf.cameras[0];controls=new THREE.TrackballControls(camera);controls.rotateSpeed=1.0;controls.zoomSpeed=1.2;controls.panSpeed=0.8;controls.noZoom=false;controls.noPan=false;controls.staticMoving=true;controls.dynamicDampingFactor=0.3;controls.keys=[65,83,68];controls.addEventListener("change",render);centerControls(scene,camera,controls);render();window.addEventListener("resize",onWindowResize,false);animate();});}\n",
"function onWindowResize(){camera.aspect=window.innerWidth/window.innerHeight;camera.updateProjectionMatrix();renderer.setSize(window.innerWidth,window.innerHeight);controls.handleResize();render();}\n",
"function animate(){requestAnimationFrame(animate);controls.update();}\n",
"function render(){tracklight.position.copy(camera.position);renderer.render(scene,camera);}\n",

View File

@ -2,16 +2,23 @@ import stl.mesh
import numpy
import quaternion
def open_cube():
data = numpy.zeros(8, dtype=stl.mesh.Mesh.dtype)
def cube(open_xz=False):
if open_xz:
data = numpy.zeros(8, dtype=stl.mesh.Mesh.dtype)
else:
data = numpy.zeros(12, dtype=stl.mesh.Mesh.dtype)
v = data["vectors"]
v[0] = [[0,0,0], [1,0,0], [1,1,0]]
v[1] = [[0,0,0], [1,1,0], [0,1,0]]
v[2] = [[1,0,0], [1,0,1], [1,1,1]]
v[3] = [[1,0,0], [1,1,1], [0,0,0]]
v[4] = [[1,0,1], [0,0,1], [0,1,1]]
v[5] = [[1,0,1], [0,1,1], [0,0,1]]
v[6] = [[0,0,1], [0,0,0], [0,1,0]]
v[7] = [[0,0,1], [0,1,0], [0,1,1]]
# Winding order might be wrong.
v[0] = [[0,0,0], [1,1,0], [1,0,0]]
v[1] = [[0,0,0], [0,1,0], [1,1,0]]
v[2] = [[1,0,0], [1,1,1], [1,0,1]]
v[3] = [[1,0,0], [1,1,0], [1,1,1]]
v[4] = [[1,0,1], [0,1,1], [0,0,1]]
v[5] = [[1,0,1], [1,1,1], [0,1,1]]
v[6] = [[0,0,1], [0,1,0], [0,0,0]]
v[7] = [[0,0,1], [0,1,1], [0,1,0]]
if not open_xz:
v[8] = [[0,1,0], [1,1,1], [1,1,0]]
v[9] = [[0,1,0], [0,1,1], [1,1,1]]
v[10] = [[0,0,0], [1,0,0], [1,0,1]]
v[11] = [[0,0,0], [1,0,1], [0,0,1]]
return data