Fix winding order
This commit is contained in:
parent
c8f0216821
commit
7ec628c836
@ -16,7 +16,7 @@
|
|||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
"c = meshutil.open_cube()"
|
"c = meshutil.cube(open_xz=True)"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -48,7 +48,6 @@
|
|||||||
"name": "stderr",
|
"name": "stderr",
|
||||||
"output_type": "stream",
|
"output_type": "stream",
|
||||||
"text": [
|
"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",
|
"/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"
|
" warnings.warn(\"Consider using IPython.display.IFrame instead\")\n"
|
||||||
]
|
]
|
||||||
@ -248,7 +247,7 @@
|
|||||||
"Math.pow(distanceToCamera,2)+\n",
|
"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",
|
"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 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 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 animate(){requestAnimationFrame(animate);controls.update();}\n",
|
||||||
"function render(){tracklight.position.copy(camera.position);renderer.render(scene,camera);}\n",
|
"function render(){tracklight.position.copy(camera.position);renderer.render(scene,camera);}\n",
|
||||||
|
|||||||
27
meshutil.py
27
meshutil.py
@ -2,16 +2,23 @@ import stl.mesh
|
|||||||
import numpy
|
import numpy
|
||||||
import quaternion
|
import quaternion
|
||||||
|
|
||||||
def open_cube():
|
def cube(open_xz=False):
|
||||||
|
if open_xz:
|
||||||
data = numpy.zeros(8, dtype=stl.mesh.Mesh.dtype)
|
data = numpy.zeros(8, dtype=stl.mesh.Mesh.dtype)
|
||||||
|
else:
|
||||||
|
data = numpy.zeros(12, dtype=stl.mesh.Mesh.dtype)
|
||||||
v = data["vectors"]
|
v = data["vectors"]
|
||||||
v[0] = [[0,0,0], [1,0,0], [1,1,0]]
|
v[0] = [[0,0,0], [1,1,0], [1,0,0]]
|
||||||
v[1] = [[0,0,0], [1,1,0], [0,1,0]]
|
v[1] = [[0,0,0], [0,1,0], [1,1,0]]
|
||||||
v[2] = [[1,0,0], [1,0,1], [1,1,1]]
|
v[2] = [[1,0,0], [1,1,1], [1,0,1]]
|
||||||
v[3] = [[1,0,0], [1,1,1], [0,0,0]]
|
v[3] = [[1,0,0], [1,1,0], [1,1,1]]
|
||||||
v[4] = [[1,0,1], [0,0,1], [0,1,1]]
|
v[4] = [[1,0,1], [0,1,1], [0,0,1]]
|
||||||
v[5] = [[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,0,0], [0,1,0]]
|
v[6] = [[0,0,1], [0,1,0], [0,0,0]]
|
||||||
v[7] = [[0,0,1], [0,1,0], [0,1,1]]
|
v[7] = [[0,0,1], [0,1,1], [0,1,0]]
|
||||||
# Winding order might be wrong.
|
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
|
return data
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user