|
1 | 1 | <template> |
2 | | - <select v-model="camera" class="my-5"> |
3 | | - <option value="cam1">PerspectiveCamera</option> |
4 | | - <option value="cam2">OrthographicCamera</option> |
5 | | - </select> |
6 | | - <select v-model="geoName" class="my-5"> |
7 | | - <option value="plane">Plane</option> |
8 | | - <option value="test">Cube</option> |
9 | | - <option value="custom">Custom</option> |
10 | | - <option value="sphere">Sphere</option> |
11 | | - </select> |
12 | | - <input v-model.number="count" type="number" /> |
13 | | - <div style="display: flex; flex-direction: row"> |
14 | | - <div style="width: 300px"> |
15 | | - <pre>{{ renderer?.three.info }}</pre> |
16 | | - </div> |
17 | | - <div class="rendererParent"> |
18 | | - <Renderer |
19 | | - ref="renderer" |
20 | | - :on-before-render="onBeforeRender" |
21 | | - :camera="camera" |
22 | | - :antialias="true" |
23 | | - :shadow-map-enabled="false" |
24 | | - > |
25 | | - <PerspectiveCamera name="cam1" :position="[5, 5, 5]" :up="[0, 0, 1]"> |
26 | | - <OrbitControls /> |
27 | | - </PerspectiveCamera> |
28 | | - <OrthographicCamera name="cam2" :position="[5, 5, 5]"> |
29 | | - <OrbitControls /> |
30 | | - </OrthographicCamera> |
31 | 2 |
|
32 | | - <BufferGeometry name="reusedGeo" :vertices="[0, 0, 0, 1, 0, 0, 1, 1, 0]" :faces="[0, 1, 2]" /> |
33 | | - <MeshBasicMaterial name="reusedMat" color="#aaa" /> |
34 | | - |
35 | | - <BoxGeometry name="reusedGeo2" /> |
36 | | - <MeshBasicMaterial name="reusedMat2" color="#770000" /> |
37 | | - |
38 | | - <Scene background="white"> |
39 | | - <Mesh :position="[0, 0, -3]" :receive-shadow="true"> |
40 | | - <MeshLambertMaterial color="#cccccc" :side="DoubleSide" /> |
41 | | - <PlaneGeometry name="plane" :width="20" :height="20" /> |
42 | | - </Mesh> |
43 | | - <PointLight :position="[0, 0, 10]" :intensity="0.25" :cast-shadow="true" /> |
44 | | - <AmbientLight :color="0xffffff" /> |
45 | | - <Points :position="posV" :scale="[s, s, s]"> |
46 | | - <PointsMaterial :color="color" :size-attenuation="false" :size="4" /> |
47 | | - <SphereGeometry name="sphere" :radius="radius" :width-segments="12" :height-segments="12" /> |
48 | | - </Points> |
49 | | - <Mesh :position="posBoxHelper"> |
50 | | - <MeshBasicMaterial color="black" /> |
51 | | - <BoxGeometry :width="0.1" :height="0.1" :depth="0.1" /> |
52 | | - </Mesh> |
53 | | - <Group |
54 | | - :enable-raycasting="false" |
55 | | - @click="onClick" |
56 | | - @mousemove="onMouseEnter" |
57 | | - @mouseenter="onMouseEnter" |
58 | | - @mouseleave="onMouseLeave" |
59 | | - > |
60 | | - <Mesh :position="pos" :rotation="rot" :cast-shadow="true"> |
61 | | - <MeshLambertMaterial transparent :opacity="opacity"> |
62 | | - <TextureLoader url="https://threejs.org/examples/textures/crate.gif" /> |
63 | | - </MeshLambertMaterial> |
64 | | - <BoxGeometry name="test" :width="w + 1" :height="w * 2 + 1" /> |
65 | | - </Mesh> |
66 | | - <Mesh :position="[-5, 0, 0]" :scale="[s, 1, 1]" :cast-shadow="true"> |
67 | | - <MeshLambertMaterial :color="color2" :side="DoubleSide" /> |
68 | | - <BufferGeometry name="custom" :vertices="vertices" /> |
69 | | - </Mesh> |
70 | | - |
71 | | - <OBJLoader |
72 | | - :position="[3, 0, 0]" |
73 | | - :scale="[20, 20, 20]" |
74 | | - url="https://raw.githubusercontent.com/alecjacobson/common-3d-test-models/master/data/stanford-bunny.obj" |
75 | | - @load="onLoad" |
76 | | - > |
77 | | - <MeshBasicMaterial :color="color3" :side="DoubleSide" /> |
78 | | - </OBJLoader> |
79 | | - <OBJLoader |
80 | | - :position="[-2, 2, 0]" |
81 | | - :rotation="[Math.PI / 2, 0, 0]" |
82 | | - :scale="[10, 10, 10]" |
83 | | - url="https://raw.githubusercontent.com/alecjacobson/common-3d-test-models/master/data/stanford-bunny.obj" |
84 | | - @load="onLoad" |
85 | | - > |
86 | | - <MeshNormalMaterial :side="DoubleSide" transparent :opacity="0.5" /> |
87 | | - </OBJLoader> |
88 | | - <Mesh v-for="i in count" :key="i" geometry="reusedGeo" material="reusedMat" :position="[i * 1.5, 0, 0]"> |
89 | | - </Mesh> |
90 | | - |
91 | | - <InstancedMesh ref="instancedMesh" geometry="reusedGeo2" material="reusedMat2" :count="step * step" /> |
92 | | - </Group> |
93 | | - <LineSegments :position="pos" :rotation="rot"> |
94 | | - <EdgesGeometry geometry="test" /> |
95 | | - </LineSegments> |
96 | | - <LineSegments> |
97 | | - <WireframeGeometry :geometry="geoName" /> |
98 | | - </LineSegments> |
99 | | - <AxesHelper :size="3" /> |
100 | | - </Scene> |
101 | | - </Renderer> |
102 | | - </div> |
103 | | - </div> |
104 | 3 | </template> |
105 | 4 |
|
106 | 5 | <script setup lang="ts"> |
107 | | -import { ref, onMounted, reactive } from "vue"; |
108 | | -import { Object3D } from "three"; |
109 | | -import { |
110 | | - DoubleSide, |
111 | | - Mesh as TMesh, |
112 | | - Vector3, |
113 | | - Vector2, |
114 | | - MeshBasicMaterial as TMeshBasicMaterial, |
115 | | - BufferGeometry as TBufferGeometry, |
116 | | - Intersection, |
117 | | - Color, |
118 | | -} from "three"; |
119 | | -
|
120 | | -const step = 20; |
121 | | -const count = ref(100); |
122 | | -const pos = ref<[number, number, number]>([0, 0, 0]); |
123 | | -const rot = ref<[number, number, number]>([0, 0, 0]); |
124 | | -const vertices = reactive<number[]>([]); |
125 | | -
|
126 | | -const w = ref(1); |
127 | | -const s = ref(1); |
128 | | -const radius = ref(1); |
129 | | -
|
130 | | -const opacity = ref(1); |
131 | | -
|
132 | | -const posV = new Vector3(5, -1, 0); |
133 | | -const posBoxHelper = ref<[number, number, number]>([0, 0, 0]); |
134 | | -const color = ref("rgb(255,0,0)"); |
135 | | -const color2 = ref("rgb(255,0,0)"); |
136 | | -const color3 = ref("rgb(255,0,0)"); |
137 | | -
|
138 | | -onMounted(() => { |
139 | | - let segs = 24; |
140 | | - let r1 = 2; |
141 | | - let r2 = 1; |
142 | | -
|
143 | | - for (let i = 0; i < segs; i++) { |
144 | | - const x1 = r1 * Math.cos(((2 * Math.PI) / segs) * i); |
145 | | - const y1 = r2 * Math.sin(((2 * Math.PI) / segs) * i); |
146 | | - const x2 = r1 * Math.cos(((2 * Math.PI) / segs) * (i + 1)); |
147 | | - const y2 = r2 * Math.sin(((2 * Math.PI) / segs) * (i + 1)); |
148 | | -
|
149 | | - vertices.push(x1, y1, 0); |
150 | | - vertices.push(x2, y2, 0); |
151 | | - vertices.push(0, 0, 0); |
152 | | - } |
153 | | -
|
154 | | - // Now set position |
155 | | - var dummy = new Object3D(); |
156 | | - for (var i = 0; i < step; i++) { |
157 | | - for (var j = 0; j < step; j++) { |
158 | | - // Iterate and offset x pos |
159 | | -
|
160 | | - dummy.position.copy(new Vector3(i * 2, j * 2, 0)); |
161 | | - dummy.updateMatrix(); |
162 | | - instancedMesh.value.three.setMatrixAt(i * step + j, dummy.matrix); |
163 | | - instancedMesh.value.three.instanceMatrix.needsUpdate = true; |
164 | | - } |
165 | | - } |
166 | | -}); |
167 | | -
|
168 | | -const onBeforeRender = () => { |
169 | | - return; |
170 | | - const angle = Date.now() / 1000; |
171 | | -
|
172 | | - opacity.value = Math.sin(2 * angle) * 0.45 + 0.5; |
173 | | -
|
174 | | - color.value = `rgb(${Math.round(Math.cos(angle) * 50 + 100)}, ${Math.round( |
175 | | - ((Math.sin(angle) + 1) / 2) * 200 + 50, |
176 | | - )}, 100)`; |
177 | | -
|
178 | | - color2.value = `rgb(${Math.round(Math.cos(angle) * 50 + 200)}, ${Math.round(Math.sin(angle) * 50 + 100)}, 50)`; |
179 | | - color3.value = `rgb(${Math.round(Math.cos(angle * 2) * 100 + 100)}, 50, ${Math.round(Math.sin(angle) * 50 + 100)})`; |
180 | | - radius.value = Math.cos(angle) + 2; |
181 | | - s.value = Math.sin(angle * 5) * 0.5 + 1; |
182 | | -
|
183 | | - w.value = Math.sin(angle) + 1; |
184 | | - pos.value = [Math.cos(angle), Math.sin(angle), Math.sin(angle)]; |
185 | | - rot.value = [Math.cos(angle) * Math.PI, 0, 0]; |
186 | | -}; |
187 | | -
|
188 | | -const onLoad = () => { |
189 | | - console.log("obj load event"); |
190 | | -}; |
191 | | -
|
192 | | -const onClick = (m: Intersection<TMesh<TBufferGeometry, TMeshBasicMaterial>>[], p: Vector2) => { |
193 | | - console.log("click"); |
194 | | - //console.log(m); |
195 | | -}; |
196 | | -
|
197 | | -const onMouseEnter = (m: Intersection<TMesh<TBufferGeometry, TMeshBasicMaterial>>[], p: Vector2) => { |
198 | | - m[0].object.material.color = new Color("red"); |
199 | | - const pt = m[0].point; |
200 | | - posBoxHelper.value = [pt.x, pt.y, pt.z]; |
201 | | - console.log("enter"); |
202 | | - //console.log({ m, p }); |
203 | | -}; |
204 | | -
|
205 | | -const onMouseLeave = (m: Intersection<TMesh<TBufferGeometry, TMeshBasicMaterial>>[], p: Vector2) => { |
206 | | - m[0].object.material.color = new Color("#aaa"); |
207 | | - console.log("leave"); |
208 | | - //console.log({ m, p }); |
209 | | -}; |
210 | | -
|
211 | | -const camera = ref("cam1"); |
212 | | -const renderer = ref(); |
213 | 6 |
|
214 | | -const geoName = ref("plane"); |
215 | | -const instancedMesh = ref(""); |
216 | 7 | </script> |
217 | 8 |
|
218 | 9 | <style> |
|
0 commit comments