ich dieses snake game gebaut haben, wo die Schlangen sind animiert um einen Haufen von Würfel Maschen mit und THREE.BoxGeometry
:Three.js: Animieren einer kastenartigen Geometrie
ich jede Schlange bestehen bevorzugen würde nur ein Netz und eine Geometrie, so dass ich leicht Texturen, abgerundete Kanten usw. hinzufügen kann.
Ich versuche, eine Reihe von 3D-Punkten zu nehmen und sie in eine einzige Geometrie zu konvertieren, die den kastenartigen Schlangen in der Demo ähnelt (wie mehrere THREE.BoxGeometry
zusammengefügt).
Ich habe die THREE.CurvePath
und THREE.ExtrudeGeometry
mit zu erreichen versucht:
_makeSnakeGeometry(positions) {
const vectors = positions.map(p => new THREE.Vector3(...p));
const curvePath = new THREE.CurvePath();
const first = vectors[1];
const last = vectors[vectors.length - 1];
let curveStart = vectors[0];
let previous = curveStart;
let previousDirection;
// Walk through the positions. If there is a change in direction, add
// a new curve to the curve path.
for (let vector of vectors.slice(1)) {
let direction = previous.clone().sub(vector);
if (vector.equals(first)) {
curveStart.sub(direction.clone().divideScalar(2));
}
if (vector.equals(last)) {
previous.sub(previousDirection.clone().divideScalar(2));
}
if ((previousDirection && !previousDirection.equals(direction)) || vector.equals(last)) {
curvePath.add(new THREE.LineCurve3(curveStart, previous));
curveStart = previous;
}
previous = vector;
previousDirection = direction;
}
const p = Const.TILE_SIZE/2;
const points = [[-p, -p], [-p, p], [p, p], [p, -p]];
const shape = new THREE.Shape(points.map(p => new THREE.Vector2(...p)));
const geometry = new THREE.ExtrudeGeometry(shape, {
steps: 20,
extrudePath: curvePath,
amount: 20
});
return geometry;
}
Leider ist es ziemlich hässlich aussieht und wir am Ende mit abgerundeten Ecken, wo die Bahnrichtung ändert:
Wenn ich die Option steps
vergrößere, sieht das resultierende Netz weniger hässlich aus, aber die Geometrie weist aufgrund der glatten gekrümmten Kanten eine große Anzahl von Scheitelpunkten auf. Ich mache mir Sorgen um eine große Anzahl von Stützpunkten, da ich diese Geometrie möglicherweise in jedem Animationsrahmen neu erstellen muss.
Um die Geometrie zu animieren, habe ich versucht, geometry.morphTargets
mit wenig Erfolg zu verwenden. Das Morph passiert, aber es sieht auch ziemlich hässlich aus. Vielleicht muss ich die Ecken der Geometrie manuell animieren?
Zusammenfassend meine Fragen sind:
- Wie kann ich eine Geometrie mit minimalen Ecken erstellen, die zusammen mehrere Box-Geometrien pieced ähnelt?
- Wie kann eine Geometrie animiert werden, wenn sich die zugrunde liegende Vertexanzahl ändern kann?
Ich glaube, Sie brauchen die Triangulation für die Kette bei jeder Aktualisierung neu zu berechnen - es sei denn, Sie eine glatte Animation benötigen? –
Idealerweise eine glatte Animation. Ich möchte das gleiche Ergebnis wie in der verknüpften Demo haben, aber mit einer einzigen Geometrie. –
Dieses Problem kann durch Verwendung nicht optimierter Geometrie (d. H. Jede Box hat ihre eigene Geometrie) vereinfacht werden. –