
import {
CSS2DRenderer,
CSS2DObject
} from "three/examples/jsm/renderers/CSS2DRenderer.js";
function _createBox1Label(object: THREE.Mesh) {
const div = document.createElement("div");
div.className = "red-box-label";
div.textContent = "红色正方体";
const earthLabel = new CSS2DObject(div);
earthLabel.position.set(0, 0.5, 0);
object.add(earthLabel);
}
function _createBox1() {
const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({
color: "red",
map: loadTexture("/img/木纹.png")
});
const object = new THREE.Mesh(geometry, material);
object.position.set(0, 0, 0);
_createBox1Label(object);
scene.value?.add(object);
}
const _initCssRender = (): CSS2DRenderer => {
const cssRender = new CSS2DRenderer();
cssRender.setSize(element.value.offsetWidth, element.value.offsetHeight);
cssRender.domElement.style.position = "absolute";
cssRender.domElement.style.top = "0";
element.value.appendChild(cssRender.domElement);
return cssRender;
};
function _initControl(): OrbitControls {
const control = new OrbitControls(
camera.value!,
cssRender.value?.domElement
);
control.target = new THREE.Vector3(0, 0, 0);
control.update();
return control;
}
onMounted(() => {
scene.value = _initScene();
camera.value = _initCamera();
cssRender.value = _initCssRender();
renderer.value = _initRenderer();
control.value = _initControl();
_initAxesHelper(10);
_initLight(scene.value);
_render();
});
const _render = () => {
const delta = new THREE.Clock().getDelta();
renderer.value!.render(scene.value!, camera.value!);
cssRender.value!.render(scene.value!, camera.value!);
const mixerUpdateDelta = clock.getDelta();
mixers.forEach((mixer) => mixer.update(mixerUpdateDelta));
composers.forEach((composer) => composer.render(delta));
renderMixins.forEach((mixin) => {
typeof mixin === "function" && mixin();
});
TWEEN.update();
typeof stats.update === "function" && stats.update();
requestAnimationFrame(_render);
};