mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-25 11:39:51 +01:00
feat: gun rotation
This commit is contained in:
1 parent
907e71ce03
commit
dd3ce21508
1 file changed
+57
-37
@@ -47,6 +47,7 @@ export function Model() {
|
|||||||
|
|
||||||
const pointer = useRef(new Vector2());
|
const pointer = useRef(new Vector2());
|
||||||
const delta = useRef(new Vector2());
|
const delta = useRef(new Vector2());
|
||||||
|
const enablePitchRotation = useRef(true);
|
||||||
|
|
||||||
const handlePointerDown = useCallback((event: ThreeEvent<PointerEvent>) => {
|
const handlePointerDown = useCallback((event: ThreeEvent<PointerEvent>) => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
@@ -65,8 +66,10 @@ export function Model() {
|
|||||||
|
|
||||||
modelTransformEvent.dispatch({
|
modelTransformEvent.dispatch({
|
||||||
pitch:
|
pitch:
|
||||||
modelTransformEvent.last!.pitch +
|
modelTransformEvent.last!.pitch -
|
||||||
delta.current.y * (Math.PI / bounds.height),
|
(enablePitchRotation.current
|
||||||
|
? delta.current.y * (Math.PI / bounds.height)
|
||||||
|
: 0),
|
||||||
yaw:
|
yaw:
|
||||||
modelTransformEvent.last!.yaw +
|
modelTransformEvent.last!.yaw +
|
||||||
delta.current.x * (Math.PI / bounds.width),
|
delta.current.x * (Math.PI / bounds.width),
|
||||||
@@ -84,6 +87,7 @@ export function Model() {
|
|||||||
event: QuicklimeEvent<ModelTransformEventData>
|
event: QuicklimeEvent<ModelTransformEventData>
|
||||||
) {
|
) {
|
||||||
turretGroup.current.rotation.z = event.data.yaw;
|
turretGroup.current.rotation.z = event.data.yaw;
|
||||||
|
gunGroup.current.rotation.x = event.data.pitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
modelTransformEvent.on(handleModelTransform);
|
modelTransformEvent.on(handleModelTransform);
|
||||||
@@ -110,19 +114,14 @@ export function Model() {
|
|||||||
});
|
});
|
||||||
})}
|
})}
|
||||||
|
|
||||||
<mesh>
|
|
||||||
<icosahedronGeometry args={[0.1]} />
|
|
||||||
<meshNormalMaterial depthTest={false} depthWrite={false} />
|
|
||||||
</mesh>
|
|
||||||
|
|
||||||
<group
|
<group
|
||||||
|
ref={turretGroup}
|
||||||
|
rotation={[0, 0, modelTransformEvent.last!.yaw]}
|
||||||
position={[
|
position={[
|
||||||
tankModel.turret_origin.x + trackModel.origin.x,
|
tankModel.turret_origin.x + trackModel.origin.x,
|
||||||
tankModel.turret_origin.z + trackModel.origin.z,
|
tankModel.turret_origin.z + trackModel.origin.z,
|
||||||
tankModel.turret_origin.y + trackModel.origin.y,
|
tankModel.turret_origin.y + trackModel.origin.y,
|
||||||
]}
|
]}
|
||||||
ref={turretGroup}
|
|
||||||
rotation={[0, 0, modelTransformEvent.last!.yaw]}
|
|
||||||
>
|
>
|
||||||
<group
|
<group
|
||||||
position={[
|
position={[
|
||||||
@@ -147,7 +146,10 @@ export function Model() {
|
|||||||
key={key}
|
key={key}
|
||||||
castShadow
|
castShadow
|
||||||
receiveShadow
|
receiveShadow
|
||||||
onPointerDown={handlePointerDown}
|
onPointerDown={(event) => {
|
||||||
|
enablePitchRotation.current = false;
|
||||||
|
handlePointerDown(event);
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@@ -155,44 +157,62 @@ export function Model() {
|
|||||||
})}
|
})}
|
||||||
|
|
||||||
<group
|
<group
|
||||||
|
ref={gunGroup}
|
||||||
|
rotation={[modelTransformEvent.last!.pitch, 0, 0]}
|
||||||
position={[
|
position={[
|
||||||
turretTankModel.turret_origin.x +
|
turretTankModel.turret_origin.x +
|
||||||
turretTrackModel.origin.x +
|
turretTrackModel.origin.x +
|
||||||
turretModel.gun_origin.x -
|
turretModel.gun_origin.x,
|
||||||
gunTankModel.turret_origin.x -
|
|
||||||
gunTrackModel.origin.x -
|
|
||||||
gunTurretModel.gun_origin.x,
|
|
||||||
turretTankModel.turret_origin.z +
|
turretTankModel.turret_origin.z +
|
||||||
turretTrackModel.origin.z +
|
turretTrackModel.origin.z +
|
||||||
turretModel.gun_origin.z -
|
turretModel.gun_origin.z,
|
||||||
gunTankModel.turret_origin.z -
|
|
||||||
gunTrackModel.origin.z -
|
|
||||||
gunTurretModel.gun_origin.z,
|
|
||||||
turretTankModel.turret_origin.y +
|
turretTankModel.turret_origin.y +
|
||||||
turretTrackModel.origin.y +
|
turretTrackModel.origin.y +
|
||||||
turretModel.gun_origin.y -
|
turretModel.gun_origin.y,
|
||||||
gunTankModel.turret_origin.y -
|
|
||||||
gunTrackModel.origin.y -
|
|
||||||
gunTurretModel.gun_origin.y,
|
|
||||||
]}
|
]}
|
||||||
>
|
>
|
||||||
{gunNodes.map((node) => {
|
<group
|
||||||
const isCurrentMantlet =
|
position={[
|
||||||
node.name ===
|
-gunTankModel.turret_origin.x -
|
||||||
`gun_${gunModel.model_id.toString().padStart(2, "0")}_mask`;
|
gunTrackModel.origin.x -
|
||||||
const isCurrentGun =
|
gunTurretModel.gun_origin.x,
|
||||||
node.name ===
|
-gunTankModel.turret_origin.z -
|
||||||
`gun_${gunModel.model_id.toString().padStart(2, "0")}`;
|
gunTrackModel.origin.z -
|
||||||
const isVisible = isCurrentGun || isCurrentMantlet;
|
gunTurretModel.gun_origin.z,
|
||||||
|
-gunTankModel.turret_origin.y -
|
||||||
|
gunTrackModel.origin.y -
|
||||||
|
gunTurretModel.gun_origin.y,
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
{gunNodes.map((node) => {
|
||||||
|
const isCurrentMantlet =
|
||||||
|
node.name ===
|
||||||
|
`gun_${gunModel.model_id.toString().padStart(2, "0")}_mask`;
|
||||||
|
const isCurrentGun =
|
||||||
|
node.name ===
|
||||||
|
`gun_${gunModel.model_id.toString().padStart(2, "0")}`;
|
||||||
|
const isVisible = isCurrentGun || isCurrentMantlet;
|
||||||
|
|
||||||
if (!isVisible) return null;
|
if (!isVisible) return null;
|
||||||
|
|
||||||
return jsxTree(node, {
|
return jsxTree(node, {
|
||||||
mesh(_, props, key) {
|
mesh(_, props, key) {
|
||||||
return <mesh {...props} key={key} castShadow receiveShadow />;
|
return (
|
||||||
},
|
<mesh
|
||||||
});
|
{...props}
|
||||||
})}
|
key={key}
|
||||||
|
castShadow
|
||||||
|
receiveShadow
|
||||||
|
onPointerDown={(event) => {
|
||||||
|
enablePitchRotation.current = true;
|
||||||
|
handlePointerDown(event);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
})}
|
||||||
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
|||||||
Reference in new issue
Block a user