@@ -10,11 +10,14 @@ function Controls({ onCameraChange }) {
|
|||||||
const { scene, camera, gl } = useThree()
|
const { scene, camera, gl } = useThree()
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// init camera position
|
// init camera position
|
||||||
camera.position.x = 12
|
camera.position.x = 16
|
||||||
camera.position.y = 12
|
camera.position.y = 12
|
||||||
// Euler rotation can be problematic since order matters
|
console.log(camera)
|
||||||
// We want it to rotate around the z or vertical axis first then the x axis
|
camera.fov = 22.5 // matches default openscad fov
|
||||||
// in Three Y is the vertical axis (Z for openscad)
|
|
||||||
|
// Order matters with Euler rotations
|
||||||
|
// We want it to rotate around the z or vertical axis first then the x axis to match openscad
|
||||||
|
// in Three.js Y is the vertical axis (Z for openscad)
|
||||||
camera.rotation._order = 'YXZ'
|
camera.rotation._order = 'YXZ'
|
||||||
|
|
||||||
if (controls.current) {
|
if (controls.current) {
|
||||||
@@ -29,7 +32,7 @@ function Controls({ onCameraChange }) {
|
|||||||
}
|
}
|
||||||
const getPositions = () => {
|
const getPositions = () => {
|
||||||
const { x: scadX, y: scadZ, z: negScadY } = target.object.position
|
const { x: scadX, y: scadZ, z: negScadY } = target.object.position
|
||||||
const scale = 10 // I'm not sure why this is exactly 10
|
const scale = 10
|
||||||
const scadY = -negScadY
|
const scadY = -negScadY
|
||||||
return [scadX * scale, scadY * scale, scadZ * scale]
|
return [scadX * scale, scadY * scale, scadZ * scale]
|
||||||
}
|
}
|
||||||
@@ -65,7 +68,7 @@ function Box(props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<mesh {...props} ref={mesh} scale={[1, 1, 1]}>
|
<mesh {...props} ref={mesh} scale={[1, 1, 1]}>
|
||||||
<boxBufferGeometry args={[props.size, props.size, props.size]} />
|
<boxBufferGeometry args={props.size} />
|
||||||
<meshStandardMaterial color={props.color} />
|
<meshStandardMaterial color={props.color} />
|
||||||
</mesh>
|
</mesh>
|
||||||
)
|
)
|
||||||
@@ -85,14 +88,6 @@ const IdeViewer = () => {
|
|||||||
currentCode = state.code
|
currentCode = state.code
|
||||||
return (
|
return (
|
||||||
<div className="p-8 border-2 m-2">
|
<div className="p-8 border-2 m-2">
|
||||||
<div className="pb-4">
|
|
||||||
Rotating the Three.js Cube should than update the openscad camera to
|
|
||||||
view the CAD object from the same angle. But having trouble translating
|
|
||||||
between the two coordinate systems. OpenScad's camera only changes X and
|
|
||||||
Z angles and Y is always 0. Where as rotation values from Three seem to
|
|
||||||
change all x, y and z. I probably need to learn a bit more about 3d
|
|
||||||
math.
|
|
||||||
</div>
|
|
||||||
<div className="relative" style={{ height: '500px', width: '500px' }}>
|
<div className="relative" style={{ height: '500px', width: '500px' }}>
|
||||||
{image && (
|
{image && (
|
||||||
<div
|
<div
|
||||||
@@ -126,10 +121,9 @@ const IdeViewer = () => {
|
|||||||
/>
|
/>
|
||||||
<ambientLight />
|
<ambientLight />
|
||||||
<pointLight position={[15, 5, 10]} />
|
<pointLight position={[15, 5, 10]} />
|
||||||
<Box position={[0, 0, 0]} size={10} color="orange" />
|
<Box position={[0, 5, 0]} size={[0.1, 10, 0.1]} color="cyan" />
|
||||||
<Box position={[0, 5, 0]} size={1} color="cyan" />
|
<Box position={[0, 0, -5]} size={[0.1, 0.1, 10]} color="orange" />
|
||||||
<Box position={[0, 0, 5]} size={1} color="magenta" />
|
<Box position={[5, 0, 0]} size={[10, 0.1, 0.1]} color="hotpink" />
|
||||||
<Box position={[5, 0, 0]} size={1} color="hotpink" />
|
|
||||||
</Canvas>
|
</Canvas>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user