1
0
mirror of https://github.com/troisjs/trois.git synced 2024-11-24 04:12:02 +08:00
This commit is contained in:
Kevin Levron 2020-09-17 22:56:02 +02:00
parent 9ceedcdade
commit cc777f0ac0

View File

@ -4,8 +4,8 @@
<StandardMaterial id="material" :transparent="true" :opacity="0.9" :metalness="0.8" :roughness="0.5"></StandardMaterial> <StandardMaterial id="material" :transparent="true" :opacity="0.9" :metalness="0.8" :roughness="0.5"></StandardMaterial>
<Scene id="scene1" background="#000000"> <Scene id="scene1" background="#000000">
<AmbientLight color="#808080"></AmbientLight> <AmbientLight color="#808080"></AmbientLight>
<PointLight ref="light" color="#ff6000"></PointLight> <PointLight color="#ff6000"></PointLight>
<PointLight ref="light" color="#0060ff" :intensity="0.5" :position="{ z: 200 }"></PointLight> <PointLight ref="light" color="#0060ff" :intensity="0.5"></PointLight>
<InstancedMesh ref="imesh" material="material" :count="NUM_INSTANCES"> <InstancedMesh ref="imesh" material="material" :count="NUM_INSTANCES">
<BoxGeometry :width="2" :height="2" :depth="10"></BoxGeometry> <BoxGeometry :width="2" :height="2" :depth="10"></BoxGeometry>
</InstancedMesh> </InstancedMesh>
@ -38,10 +38,11 @@ export default {
EffectComposer, RenderPass, UnrealBloomPass, EffectComposer, RenderPass, UnrealBloomPass,
}, },
setup() { setup() {
const NUM_INSTANCES = 2500; const NUM_INSTANCES = 2000;
const instances = []; const instances = [];
const target = new Vector3(); const target = new Vector3();
const dummy = new Object3D(); const dummyO = new Object3D();
const dummyV = new Vector3();
for (let i = 0; i < NUM_INSTANCES; i++) { for (let i = 0; i < NUM_INSTANCES; i++) {
instances.push({ instances.push({
@ -58,7 +59,8 @@ export default {
NUM_INSTANCES, NUM_INSTANCES,
instances, instances,
target, target,
dummy, dummyO,
dummyV,
}; };
}, },
mounted() { mounted() {
@ -71,11 +73,11 @@ export default {
init() { init() {
// init instanced mesh matrix // init instanced mesh matrix
for (let i = 0; i < this.NUM_INSTANCES; i++) { for (let i = 0; i < this.NUM_INSTANCES; i++) {
const { position, scale } = this.instances[i]; const { position, scale, scaleZ } = this.instances[i];
this.dummy.position.copy(position); this.dummyO.position.copy(position);
this.dummy.scale.set(scale, scale, scale); this.dummyO.scale.set(scale, scale, scaleZ);
this.dummy.updateMatrix(); this.dummyO.updateMatrix();
this.imesh.setMatrixAt(i, this.dummy.matrix); this.imesh.setMatrixAt(i, this.dummyO.matrix);
} }
this.imesh.instanceMatrix.needsUpdate = true; this.imesh.instanceMatrix.needsUpdate = true;
@ -86,19 +88,18 @@ export default {
this.target.copy(this.renderer.three.mouseV3); this.target.copy(this.renderer.three.mouseV3);
this.light.position.copy(this.target); this.light.position.copy(this.target);
const v = new Vector3();
for (let i = 0; i < this.NUM_INSTANCES; i++) { for (let i = 0; i < this.NUM_INSTANCES; i++) {
const { position, scale, scaleZ, velocity, attraction, vlimit } = this.instances[i]; const { position, scale, scaleZ, velocity, attraction, vlimit } = this.instances[i];
v.copy(this.target).sub(position).normalize().multiplyScalar(attraction); this.dummyV.copy(this.target).sub(position).normalize().multiplyScalar(attraction);
velocity.add(v).clampScalar(-vlimit, vlimit); velocity.add(this.dummyV).clampScalar(-vlimit, vlimit);
position.add(velocity); position.add(velocity);
this.dummy.position.copy(position); this.dummyO.position.copy(position);
this.dummy.scale.set(scale, scale, scaleZ); this.dummyO.scale.set(scale, scale, scaleZ);
this.dummy.lookAt(v.copy(position).add(velocity)); this.dummyO.lookAt(this.dummyV.copy(position).add(velocity));
this.dummy.updateMatrix(); this.dummyO.updateMatrix();
this.imesh.setMatrixAt(i, this.dummy.matrix); this.imesh.setMatrixAt(i, this.dummyO.matrix);
} }
this.imesh.instanceMatrix.needsUpdate = true; this.imesh.instanceMatrix.needsUpdate = true;
}, },