| import * as THREE from "three"; |
| import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; |
| |
| export function initThree() { |
| THREE.Object3D.DefaultUp.set(0, 0, 1); |
| |
| var scene = new THREE.Scene(); |
| var camera = new THREE.PerspectiveCamera( |
| 60, |
| window.innerWidth / window.innerHeight, |
| 1, |
| 1000000 |
| ); |
| camera.position.set(0, 0, 10); |
| var renderer = new THREE.WebGLRenderer(); |
| renderer.setSize(window.innerWidth, window.innerHeight); |
| renderer.setClearColor(0x999999); |
| document.body.appendChild(renderer.domElement); |
| |
| var controls = new OrbitControls(camera, renderer.domElement); |
| controls.mouseButtons = { |
| LEFT: null as unknown as THREE.MOUSE, |
| |
| RIGHT: THREE.MOUSE.RIGHT, |
| MIDDLE: THREE.MOUSE.MIDDLE, |
| }; |
| |
| var grid = new THREE.GridHelper(20, 40); |
| grid.geometry.rotateX(Math.PI / 2); |
| grid.position.set(0, 0.05, 0); |
| scene.add(grid); |
| |
| var mouse = new THREE.Vector3(); |
| |
| var started = false; |
| |
| var MAX_POINTS = 5; |
| |
| |
| var geometry = new THREE.BufferGeometry(); |
| |
| var positions = new Float32Array(MAX_POINTS * 3); |
| geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3)); |
| |
| |
| var drawCount = 3; |
| geometry.setDrawRange(0, drawCount); |
| |
| var material = new THREE.LineBasicMaterial({ color: 0xff0000 }); |
| |
| var line = new THREE.Line(geometry, material); |
| scene.add(line); |
| |
| var corePositions = line.geometry.attributes.position.array as any; |
| |
| var started = false; |
| |
| drawRect(); |
| |
| function drawRect() { |
| |
| geometry = new THREE.BufferGeometry(); |
| |
| positions = new Float32Array(MAX_POINTS * 3); |
| geometry.setAttribute("position", new THREE.BufferAttribute(positions, 3)); |
| |
| drawCount = 3; |
| geometry.setDrawRange(0, drawCount); |
| |
| |
| material = new THREE.LineBasicMaterial({ color: 0xff0000 }); |
| |
| line = new THREE.Line(geometry, material); |
| scene.add(line); |
| |
| corePositions = line.geometry.attributes.position.array; |
| |
| |
| window.addEventListener("mousedown", onMouseDown, false); |
| window.addEventListener("mousemove", onMouseMove, false); |
| window.addEventListener("mouseup", onMouseUp, false); |
| } |
| |
| render(); |
| |
| |
| function onMouseDown(event: any) { |
| if (!started) { |
| mouse.x = (event.clientX / window.innerWidth) * 2 - 1; |
| mouse.y = -(event.clientY / window.innerHeight) * 2 + 1; |
| mouse.z = 0; |
| |
| const raycaster = new THREE.Raycaster(); |
| var plane = new THREE.Plane(new THREE.Vector3(0, 0, 1), 0); |
| |
| raycaster.setFromCamera(mouse, camera); |
| var intersects = new THREE.Vector3(); |
| let planeIntersect = raycaster.ray.intersectPlane(plane, intersects)!; |
| |
| console.log(planeIntersect); |
| |
| |
| corePositions[0] = planeIntersect.x; |
| corePositions[1] = planeIntersect.y; |
| corePositions[2] = 0; |
| |
| |
| |
| line.geometry.setDrawRange(1, drawCount++); |
| line.geometry.attributes.position.needsUpdate = true; |
| |
| started = true; |
| } |
| } |
| |
| function onMouseMove(event: any) { |
| if (started) { |
| mouse.x = (event.clientX / window.innerWidth) * 2 - 1; |
| mouse.y = -(event.clientY / window.innerHeight) * 2 + 1; |
| mouse.z = 0; |
| |
| const raycaster = new THREE.Raycaster(); |
| var plane = new THREE.Plane(new THREE.Vector3(0, 0, 1), 0); |
| |
| raycaster.setFromCamera(mouse, camera); |
| var intersects = new THREE.Vector3(); |
| let planeIntersect = raycaster.ray.intersectPlane(plane, intersects)!; |
| |
| |
| |
| |
| |
| corePositions[3] = planeIntersect.x; |
| corePositions[4] = corePositions[1]; |
| corePositions[5] = 0; |
| |
| corePositions[6] = planeIntersect.x; |
| corePositions[7] = planeIntersect.y; |
| corePositions[8] = 0; |
| |
| corePositions[9] = corePositions[0]; |
| corePositions[10] = planeIntersect.y; |
| corePositions[11] = 0; |
| |
| corePositions[12] = corePositions[0]; |
| corePositions[13] = corePositions[1]; |
| corePositions[14] = 0; |
| |
| line.geometry.setDrawRange(0, 5); |
| line.geometry.attributes.position.needsUpdate = true; |
| } |
| } |
| |
| function onMouseUp(event: any) { |
| if (started) { |
| mouse.x = (event.clientX / window.innerWidth) * 2 - 1; |
| mouse.y = -(event.clientY / window.innerHeight) * 2 + 1; |
| mouse.z = 0; |
| |
| const raycaster = new THREE.Raycaster(); |
| var plane = new THREE.Plane(new THREE.Vector3(0, 0, 1), 0); |
| |
| raycaster.setFromCamera(mouse, camera); |
| var intersects = new THREE.Vector3(); |
| let planeIntersect = raycaster.ray.intersectPlane(plane, intersects)!; |
| |
| console.log(corePositions); |
| console.log(planeIntersect); |
| |
| |
| geometry = new THREE.BufferGeometry(); |
| geometry.attributes.position = new THREE.BufferAttribute( |
| corePositions, |
| 3 |
| ); |
| |
| geometry.setIndex([0, 1, 2, 2, 3, 0]); |
| |
| let mesh = new THREE.Mesh( |
| geometry, |
| new THREE.MeshBasicMaterial({ |
| color: 0xfefefe, |
| side: THREE.DoubleSide, |
| transparent: true, |
| opacity: 0.1, |
| }) |
| ); |
| |
| scene.add(mesh); |
| |
| window.removeEventListener("mousemove", onMouseMove); |
| window.removeEventListener("mousedown", onMouseDown); |
| window.removeEventListener("mouseup", onMouseUp); |
| |
| started = false; |
| } |
| } |
| |
| function render() { |
| requestAnimationFrame(render); |
| renderer.render(scene, camera); |
| } |
| } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战