|
35 | 35 |
|
36 | 36 | function init() { |
37 | 37 |
|
| 38 | + const controlsDomElement = document.createElement( 'div' ); |
| 39 | + controlsDomElement.style.position = 'absolute'; |
| 40 | + controlsDomElement.style.top = '0'; |
| 41 | + controlsDomElement.style.width = '100%'; |
| 42 | + controlsDomElement.style.height = '100%'; |
| 43 | + document.body.appendChild( controlsDomElement ); |
| 44 | + |
38 | 45 | rendererCSS3D = new CSS3DRenderer(); |
39 | 46 | rendererCSS3D.setSize( window.innerWidth, window.innerHeight ); |
40 | 47 | document.body.appendChild( rendererCSS3D.domElement ); |
41 | 48 |
|
42 | 49 | rendererWebGL = new THREE.WebGLRenderer( { antialias: true, alpha: true } ); |
43 | 50 | rendererWebGL.domElement.style.position = 'absolute'; |
44 | 51 | rendererWebGL.domElement.style.top = '0'; |
| 52 | + rendererWebGL.domElement.style.pointerEvents = 'none'; |
45 | 53 | rendererWebGL.setPixelRatio( window.devicePixelRatio ); |
46 | 54 | rendererWebGL.setSize( window.innerWidth, window.innerHeight ); |
47 | 55 | rendererWebGL.toneMapping = THREE.NeutralToneMapping; |
|
74 | 82 | premultipliedAlpha: true |
75 | 83 | } ); |
76 | 84 | const mesh = new THREE.Mesh( geometry, material ); |
77 | | - mesh.name = 'cutout'; |
78 | 85 | scene.add( mesh ); |
79 | 86 |
|
80 | 87 | // Add frame |
|
86 | 93 | iframe.style.width = '1028px'; |
87 | 94 | iframe.style.height = '768px'; |
88 | 95 | iframe.style.border = '0px'; |
| 96 | + iframe.style.backfaceVisibility = 'hidden'; |
89 | 97 | iframe.src = './#webgl_animation_keyframes'; |
90 | 98 | scene.add( new CSS3DObject( iframe ) ); |
91 | 99 |
|
92 | 100 | // Add controls |
93 | 101 | controls = new OrbitControls( camera ); |
94 | | - controls.connect( rendererWebGL.domElement ); |
| 102 | + controls.connect( controlsDomElement ); |
| 103 | + controls.addEventListener( 'start', () => iframe.style.pointerEvents = 'none' ); |
| 104 | + controls.addEventListener( 'end', () => iframe.style.pointerEvents = 'auto' ); |
95 | 105 | controls.enableDamping = true; |
96 | 106 |
|
97 | | - // Track OrbitControls state |
98 | | - let isDragging = false; |
99 | | - controls.addEventListener( 'start', () => isDragging = true ); |
100 | | - controls.addEventListener( 'end', () => isDragging = false ); |
101 | | - |
102 | | - // raycast to find CSS3DObject |
103 | | - const raycaster = new THREE.Raycaster(); |
104 | | - const pointer = new THREE.Vector2(); |
105 | | - document.addEventListener( 'pointermove', ( event ) => { |
106 | | - |
107 | | - // Skip raycasting when dragging |
108 | | - if ( isDragging ) return; |
109 | | - |
110 | | - pointer.x = ( event.clientX / window.innerWidth ) * 2 - 1; |
111 | | - pointer.y = - ( event.clientY / window.innerHeight ) * 2 + 1; |
112 | | - |
113 | | - raycaster.setFromCamera( pointer, camera ); |
114 | | - |
115 | | - const intersects = raycaster.intersectObjects( scene.children, true ); |
116 | | - |
117 | | - rendererWebGL.domElement.style.pointerEvents = ''; |
118 | | - |
119 | | - if ( intersects.length > 0 ) { |
120 | | - |
121 | | - const object = intersects[ 0 ].object; |
122 | | - |
123 | | - if ( object.name === 'cutout' ) { |
124 | | - |
125 | | - rendererWebGL.domElement.style.pointerEvents = 'none'; |
126 | | - |
127 | | - } |
128 | | - |
129 | | - } |
130 | | - |
131 | | - } ); |
132 | | - |
133 | 107 | window.addEventListener( 'resize', onWindowResize ); |
134 | 108 |
|
135 | 109 | } |
|
0 commit comments