You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React-three-fiber中圆柱体(硬币)无法平稳旋转的问题排查

解决React Three Fiber中硬币旋转晃动问题

问题场景

用低高度的cylinderGeometry模拟硬币形态,为让硬币正面朝向屏幕,先对圆柱体z轴做初始旋转Math.PI / 2,但添加y轴旋转后,硬币出现晃动、旋转不居中的情况,呈现滚动而非自旋的效果。

问题原因

Three.js默认采用XYZ欧拉角旋转顺序,先设置z轴旋转后,后续修改y轴旋转时,会基于已旋转后的局部坐标系计算,导致旋转轴偏移,最终出现晃动现象。

解决方案

通过分层旋转解决:用空group作为父容器,将动态y轴旋转应用在父容器上,硬币mesh仅保留初始z轴旋转。两个旋转操作在不同层级,互不干扰,确保自旋轴为世界空间的y轴。

修正后的代码

import { Canvas, useFrame } from "@react-three/fiber";
import React, { useRef } from "react";
import * as THREE from 'three';

type CoinType = {};

const Coin: React.FC<CoinType> = () => {
  // 引用父容器group而非mesh
  const groupRef = useRef<THREE.Group>(null);

  useFrame((state, delta) => {
    if (groupRef.current) {
      // 旋转父容器的y轴
      groupRef.current.rotation.y += 4 * delta;
    }
  });

  return (
    <>
      <spotLight
        position={[10, 10, 10]}
        angle={0.15}
        penumbra={1}
        decay={0}
        intensity={Math.PI}
      />
      <directionalLight position={[0, 0, 3]} />
      {/* 父容器负责动态y轴旋转 */}
      <group ref={groupRef} position={[0, 0, 0]}>
        {/* 硬币mesh仅负责初始z轴旋转,让正面朝向屏幕 */}
        <mesh rotation={[0, 0, Math.PI / 2]}>
          <cylinderGeometry args={[2, 2, 0.3, 128]} />
          <meshStandardMaterial color={"#D2E9FB"} />
        </mesh>
      </group>
    </>
  );
};

export default Coin;

补充说明

也可以通过修改mesh的旋转顺序解决,比如设置mesh.rotation.order = "ZYX",但分层旋转的方式更直观,也便于后续扩展(比如添加硬币位移动画等)。

内容的提问来源于stack exchange,提问作者Alexei Belozertsev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 06:20:02