您是否有兴趣控制3D模型的动画?最近,使用AI的3D模型生成工具越来越多,其中Meshy AI吸引了人们作为一种工具,使您可以轻松地创建高质量的3D模型。
但是,为了在实际应用程序中利用生成的3D模型,您需要掌握特定的库和工具。在本文中,我们将解释如何使用React和Trix.js
📺检查网格:此链接的官方页面上检查它
将来,我们将继续创建课程,并从打字稿x进行三个反应三个光纤!
我们将在YouTube上发布公告,因此请订阅我们的YouTube频道并等待通知!
📺观看YouTube :您可以从此链接
如果您想知道三个纤维可以做什么反应,请参考以下内容!
我们有易于使用的作品!
3D模型显示演示
您可以在下面的视频中看到成品的演示。
📺在YouTube上观看演示:链接中观看

此外,该项目的源代码可在GitHub上获得。
请下载代码并尝试!
💾github存储库:此链接中检查源代码
如果您想知道,“我已经看过,我该怎么做?”,不用担心!
在本文中,我们将逐步解释如何查看此3D模型。
必要的技术和关键库
该项目使用以下技术和库:这是对每个角色的简要说明。
- 反应
- 前端开发图书馆
- 具有基于组件设计的高效UI构造
- 三
- 一个用于在网络上绘制3D图形的库
- 它使处理复杂的WebGL操作变得容易
- 反应三个纤维
- 包装库,用于处理react中的三个js
- 您可以利用React开发风格中的Three.js的强大功能
- 反应你
- 反应三个光纤扩展库
- 反应三个光纤扩展库
- 网眼
- 一项可让您轻松使用AI轻松生成高质量3D模型的服务
环境准备
本节为您的项目提供初始设置。使用NPX命令创建一个React应用程序,安装所需的库并组织文件夹结构。
创建React应用程序
首先,使用NPX命令创建一个React应用程序。
npx create-react-app meshy-3D模型动画 - themplate tesscript
Meshy-3D-Model-Animathion
是该项目的名称- 网板
通过指定打字稿使用启用打字稿的模板
安装所需的库
安装反应三个光纤和其他库。
CD Meshy-3D-Model-Animathion NPM安装三个 @react-three/fiber @react-three/drei
- 三:三。
- @react-three/fiber :用于使用react的三个.js的包装纸
- @react-three/drei :有用的帮助者,例如相机控件和文本图纸
查看文件夹结构并删除不必要的文件
从初始状态组织并添加文件夹,如下所示:
基本上,它是默认值,但是对于您不知道的文件,请查看GitHub。
meshy-3d-model-animation/├-node_modules/├istar/├ispupppublic/├istry/ // 3D型号和相关文件├I-unik_glb // 3D模型文件夹├I- animation_pod_baby_groove_withskin.glb // glb files with dance Animation├I-andimation_superlove_pop_pop_dance_withskin.glb //带有舞蹈动画的GLB文件├-src/ src/ src/ src/ src/ src/ src/ components // ├──threeDdancinguncle/ // page-by-page文件夹│└│└││└│└││└││ //全局样式│ - index.css //全局css├iscs.json.json//项目设置tsconfig.json // Typecript Settings└-
这次要修改的文件如下:
app.tsx
:应用程序输入点页面> index.ts
:索引文件将页面导出到。页面/threeddancinguncle
:这次要创建的文件夹threeddancinguncle.tsx
:主页的组成部分。
生成带网状的3D模型
这次,3D模型将使用称为Meshy的AI自动生成服务。
链接在下面,因此请参考。
每月可免费获得200个学分。
📺检查网格:此链接的官方页面上检查它
与文本生成模型生成3D模型
这次,我们将生成带有文本的模型。
请选择“新型号”。

我想让我的男人跳舞,所以我决定“一个真正的中年侦探的整个身体,他的手臂散开了。”
之后,您需要设置关节和其他东西,因此最好将手臂尽可能地远离身体。

这次我将尝试使用左上方。
选择并选择检查纹理和remesh。

这将生成类似于您选择的模型的模型。

接下来,选择动画>索具以添加动画。

这次,由于我们是人,我们应该选择类人动物。

我认为没有必要更改下一个屏幕,但是我的身高有些搞砸了。

如果您设置好良好,动画将是美丽的。
设置关节后,检查一下。

这将生成动画3D模型。
默认情况下,有一个步行动画。

添加动画
这次,我们将添加多个舞蹈动画。

使用添加按钮添加您选择的多个舞蹈。

默认情况下,包括运行,但是您可以看到除此之外还有其他三个舞蹈。

以GLB格式下载
创建3D模型并添加动画后,请使用GLB下载。
此时,检查所有动画。

这将为每个动画输出一个GLB文件,如下所示。
GLB文件带有一组3D模型和动画,因此不存在模型文件。

确保将GLB文件存储在公共下。
这次,它存储在下面。
meshy-3d-model-animation/├-node_modules/└istar/└ispupppublic/└istry/ // 3D型号和相关文件└I-unik_glb // 3D模型文件夹├I- animation_pod_baby_groove_withskin.glb // with Dance Animation tance Animation└isnimation_superlove_pop_dance_withskin.glb//带有舞蹈动画的GLB文件
每个步骤的源代码的详细说明
在以下各节中,我们将按顺序详细说明以下五个部分。
- 导入React和三个JS的基本模块。
- 导入
GLTFLOADER
和EXRLOADER
- 使用
OrbitControls
- 与模型和动画有关的恒定。
- 定义以下内容:
- 动画文件列表:以列表格式保留多个动画文件的名称和路径。
- 摄像机默认值:定义相机位置,以便您可以看到整个型号。
- 灯光设置:设置环境光,定向光和点光的强度和位置。
- HDRI背景路径:为背景指定HDRI映像文件。
Exrloader
加载HDRI图像- 按照以下方式应用已加载的HDRI:
场景。背景
:将HDRI图像设置为整个场景的背景。场景。环境
:HDRI用于模型反射和照明。
GLTFLOADER
加载模型- 加载初始动画(
default_animation_file
- 缩放,旋转并定位导入的模型并将其放置在现场
- 加载初始动画(
AnimationMixer
用于管理动画- 将动画应用于导入的模型
- 当前的播放动画React的状态(
USESTATE
),并且可以使用用户操作进行切换。
- 使用
useFrame
检查整个来源
以下是完整的源代码,该代码以使用Meshy AI生成的GLB格式控制3D模型,该格式是在本文中创建的,使用React和Trix.js创建将所有代码放在一起,因此很容易了解其工作原理。
如果您想查看其他来源,请检查Github。
💾github存储库:此链接中检查源代码
导入'./app.css';从'./pages'导入{threeddancuncle};功能应用程序(){返回(<div className="App"><ThreeDDancingUncle /></div> ); }导出默认应用程序;
从“ ./threeddancinguncle/threeddancinguncle”进口ThreedDancinguncle;导出{threeddancinguncle}
// ===== //第1部分:导入所需的模块// ====导入react,{usestate,useffect}从“ react”;导入{canvas,useframe,usethree},来自“@react-three/fiber”;从“@react-three/drei”中导入{orbitControls};导入{gltfloader}来自“三/示例/jsm/loaders/gltfloader”;导入{exrloader}来自“三个/示例/jsm/loaders/exrloader”;从“三”中导入 *为三个; // ==== //第2部分:定义常数// ==== //动画文件列表//存储每个动画的名称和路径const and insimation_files = [{name:“ pod baby groove”,path:“/mmodels/models/uncle_glb/animation_pod_pod_baby_baby_brove_groove_groove_with name name name name name name name nage annam gangem angal angal angal::” “/models/uncle_glb/animation_gangnam_groove_withskin.glb”},{name:“ pop dance”,path:“ /models/uncle_glb/animation_superlove_pop_pop_dance_dance_withs_withskin.glb”},]; //模型文件的路径const default_animation_file = andimation_files [0] .path; //到达HDRI映像的路径(对于背景)const hdri_file =“/hdri/cobblestone_street_night_4k.exr”; //初始摄像机位置(x,y,z)const initial_camera_position = new three.vector3(10,4,10); //型号放大量表const model_scale = 4; //初始模型旋转角度(关于y轴,在弧度中)const model_rotation_y = -1; //初始模型位置(X,Y,Z)const model_position = new Trix.Vector3(0,-2,0); //灯光设置//定义环境,方向和点光的位置和强度const light_settings = {abirent:{强度:0.5},//环境光强度方向:{位置:new triew.vector3(10,20,20,10),强度:1.5},1.5},// // // // //的位置和强度,// // // // // serive 3 extription:new triend ofters new triend:new triend:new free new 3 new triend:new freecter:new freew; 1.5},//点光的位置和强度}; // ======= //第3部分:背景设置// ======= //用HDRI映像const背景设置场景背景:react.fc =()=> {const {gl,scene} = usethree(); useffect(()=> {const hdrloader = new exrloader(); const pmremgenerator = new trix.pmremgenerator(gl); pmremgenerator.compileequiretectangularshader(); PMREMGERATER。返回null; //无渲染目标}; // ==== //第4部分:模型和动画// ===== //加载主模型和管理动画const模型:react.fc <{currentAnimation:string}> =({currentAnimation})=> {const {const {conse {camera} = usethree(usethree(); const [型号,setModel] = usestate<THREE.Group | null> (无效的); const [搅拌机,setMixer] = usestate<THREE.AnimationMixer | null> (无效的); //加载模型使用((()=> {const loader = new Gltfloader(); loader.load(default_animation_file,(gltf)=> {const {const {const {cast {场景:loadedScene} = gltf; loadedscene.scale.scale.scale.set.set(model_scale,model_scale,model_scale,model_scale setece)side.s simes.y side。 //设置模型的旋转。 0); //查看模型的中心); //切换动画useffect(()=> {if(!model ||!搅拌)return; const loader = new Gltfloader(); loader.load(currentAnimation,(gltf)=> {const newAnimation = gltf.animation = gltf.animations [0]; if(newAnimation) action.reset()。fadein(0.5).play(); //更新动画useframe(((_,delta)=> {if(mixer)mixer.update(delta);});返回模型?<primitive object={model} /> : 无效的; //显示模型}; // ===== //第5部分:主组件// ===== //配置整个应用程序const threeddancinguncle:react.fc =()=> {const [currentAnimation,setCurrentAnimation] = usestate(animation_files_files [0] .path);返回 (<div style={{ width: "100vw", height: "100vh", position: "relative" }}> {/ *动画选择按钮 */} <div style={{ position: "absolute", top: "10px", left: "10px", zIndex: 10, // ボタンをCanvasの上に表示 }} > {animation_files.map(((anim,index)=>( <button key={index} onClick={() =>setCurrentAnimation(anim.path)} //切换动画样式= {{margin:“ 5px”,Padding:“ 10px”,fontsize:“ fontsize:“ fontsize:“ 14px”) “ 5px”,光标:“指针”,}}> {anim.name}</button> )}}}</div><Canvas> {/ *背景组件 */}<Background /> {/ *模型和动画 */}<Model currentAnimation={currentAnimation} /> {/ *灯光设置 */} <ambientLight intensity={LIGHT_SETTINGS.ambient.intensity} /><directionalLight position={LIGHT_SETTINGS.directional.position} intensity={LIGHT_SETTINGS.directional.intensity} /><pointLight position={LIGHT_SETTINGS.point.position} intensity={LIGHT_SETTINGS.point.intensity} /> {/ *相机操作 */}<OrbitControls /></Canvas></div> ); };导出默认的threeddancinguncle;
第1部分:导入所需模块
这将准备使用React和3.js构建3D场景所需的模块。
// ===== //第1部分:导入所需的模块// ====导入react,{usestate,useffect}从“ react”;导入{canvas,useframe,usethree},来自“@react-three/fiber”;从“@react-three/drei”中导入{orbitControls};导入{gltfloader}来自“三/示例/jsm/loaders/gltfloader”;导入{exrloader}来自“三个/示例/jsm/loaders/exrloader”;从“三”中导入 *为三个;
- 反应
USESTATE
:切换动画并管理状态。使用效果
:初始化模型或背景时运行。
- 反应三个纤维
画布
:用于绘制3D场景的容器。USEFRAME
:为每个帧执行动画更新处理。Usethree
:访问摄像头,场景和渲染器,三分。
- @react-three/drei
OrbitControls
:一种方便的组件,允许用户自由控制(旋转,缩放,移动)相机。
- 三
GLTFLOADER
:用于以GLB格式加载3D型号的加载器。Exrloader
:加载HDRI图像并将其用作背景和环境光。3. vector3
:矢量操作(例如,摄像头或光位置)。三个pmremgenerator
:将HDRI转换为环境图以实现逼真的照明。
第2部分:恒定定义
接下来是恒定定义。
定义常数中央管理您的应用程序中使用的值,从而提高可重复性和可读性。由于设置3D模型和场景的值在代码中无处不在,因此它们的常数更易于维护。
// ==== //第2部分:定义常数// ==== //动画文件列表//存储每个动画的名称和路径const and insimation_files = [{name:“ pod baby groove”,path:“/mmodels/models/uncle_glb/animation_pod_pod_baby_baby_brove_groove_groove_with name name name name name name name nage annam gangem angal angal angal::” “/models/uncle_glb/animation_gangnam_groove_withskin.glb”},{name:“ pop dance”,path:“ /models/uncle_glb/animation_superlove_pop_pop_dance_dance_withs_withskin.glb”},]; //模型文件的路径const default_animation_file = andimation_files [0] .path; //通往HDRI映像的路径(对于背景)const hdri_file =“/hdri/cobblestone_street_night_4k.exr”; //初始摄像机位置(x,y,z)const initial_camera_position = new three.vector3(10,4,10); //型号放大量表const model_scale = 4; //模型的初始旋转角度(大约是y轴,在弧度中)const model_rotation_y = -1; //模型初始位置(X,Y,Z)const model_position = new Trix.Vector3(0,-2,0); //灯光设置//定义环境,方向和点光const light_settings = {abirent:{强度:0.5},//环境光强度方向的位置和强度:{0.5}:{位置:new triew.vector3(10,20,20,10),强度:1.5},1.5},// // //的位置和强度。 1.5},//点光的位置和强度};
根据您生成的3D模型,可能需要进行良好的调整,因此请使用以下内容作为参考来播放数字。
- 动画文件列表
- 以成对定义动画名称和路径来管理多个动画。
- HDRI图像路径的背景路径
- 指定将HDRI图像用作场景或环境图的背景的路径。
- 相机初始设置
- 定义相机的初始位置和方向,并调整整个模型以使其看起来合适。
- 模型设置
- 定义模型的尺度(大小),旋转角度和初始位置。
- 灯光设置
- 定义环境,定向和点灯的位置和强度,以正确照亮整个场景。
第3部分:背景设置
使用HDRI图像将现实的自然背景和环境光应用到您的场景中。
HDRI图像 Poly Haven 免费下载您应该选择自己喜欢的背景。
// ===== //第3部分:设置背景// ===== //使用HDRI映像const背景设置场景背景:react.fc =()=> {const {gl,scene} = usethree(); useffect(()=> {const hdrloader = new exrloader(); const pmremgenerator = new trix.pmremgenerator(gl); pmremgenerator.compileequiretectangularshader(); PMREMGERATER。返回null; //无渲染目标};
- 加载HDRI图像
Exrloader
加载HDRI图像PMRemganerator
将HDRI转换为环境图
- 应用背景
- 加载的HDRI图像设置为场景背景(
scene.background
)。 - 环境图(
场景。环境
),用于反射和照明模型。
- 加载的HDRI图像设置为场景背景(
- 内存管理
- 将HDRI图像应用到现场后,正确释放了不必要的资源(纹理和发电机)。
第4部分:地面设置
将3D模型加载到场景中,使您可以控制和切换多个动画。
每个帧对动画进行平稳更新,从而实时移动。
// ==== //第4部分:模型和动画// ===== //加载主模型和管理动画const模型:react.fc <{currentAnimation:string}> =({currentAnimation})=> {const {const {carter {camera} = usethree(usethree(); const [型号,setModel] = usestate<THREE.Group | null> (无效的); const [搅拌机,setMixer] = usestate<THREE.AnimationMixer | null> (无效的); //加载模型使用((()=> {const Loader = new Gltfloader(); loader.load(default_animation_file,(gltf)=> {const {const {const {cast {caste {caste:loadedScene} = gltf; loadedScene.scale.scale.scale.set.set(model_scale,model_scale,model_scale,model_scale secene; set.secene; //设置模型的旋转。 0); //查看模型的中心); //切换动画useffect(()=> {if(!model ||!搅拌)return; const loader = new Gltfloader(); loader.load(currentAnimation,(gltf)=> {const newAnimation = gltf.animation = gltf.animations [0]; if(newAnimation) action.reset()。fadein(0.5).play(); //更新动画useframe(((_,delta)=> {if(mixer)mixer.update(delta);});返回模型?<primitive object={model} /> : 无效的; //查看模型};
- 加载模型
GLTFLOADER
加载3D模型以GLB格式加载- 适当设置模型的比例,位置和旋转,然后将其添加到场景中。
- 管理动画
AnimationMixer
应用于模型- 动画切换功能已根据用户操作实现。
- 逐框更新
- 使用
useFrame
- 基于经过的时间(Delta)的动画顺利进行。
- 使用
- 状态管理
- 使用React的
Usestate
- 实时反映用户选择的动画。
- 使用React的
第5部分:主要组件
使用React配置整个应用程序并集成每个功能(背景,模型,动画,灯光设置)。
我们还将在此处列出可容纳用户可以使用的UI(例如动画切换按钮)。
// ===== //第5部分:主组件// ===== //配置整个应用程序const threeddancinguncle:react.fc =()=> {const [CurrentAnimation,setCurrentAnimation,setCurrentAnimation] = usestate(animation_files_files [0] .path);返回 (<div style={{ width: "100vw", height: "100vh", position: "relative" }}> {/ *动画选择按钮 */} <div style={{ position: "absolute", top: "10px", left: "10px", zIndex: 10, // ボタンをCanvasの上に表示 }} > {animation_files.map(((anim,index)=>( <button key={index} onClick={() =>setCurrentAnimation(anim.path)} //切换动画样式= {{margin:“ 5px”,Padding:“ 10px”,fontsize:“ fontsize:“ fontsize:“ 14px”) “ 5px”,光标:“指针”,}}> {anim.name}</button> )}}}</div><Canvas> {/ *背景组件 */}<Background /> {/ *模型和动画 */}<Model currentAnimation={currentAnimation} /> {/ *灯光设置 */} <ambientLight intensity={LIGHT_SETTINGS.ambient.intensity} /><directionalLight position={LIGHT_SETTINGS.directional.position} intensity={LIGHT_SETTINGS.directional.intensity} /><pointLight position={LIGHT_SETTINGS.point.position} intensity={LIGHT_SETTINGS.point.intensity} /> {/ *相机操作 */}<OrbitControls /></Canvas></div> ); };导出默认的threeddancinguncle;
- 安装画布
画布
绘制3D场景的框架
- 集成每个功能
- 背景(
背景
添加 - 绘制模型和动画(
模型
- 灯光设置(环境光,定向光,点光)放在场景中。
- 背景(
- UI放置
- React的状态管理(
USESTATE
实现一个按钮,该按钮可以切换用户选择的动画 - UI
画布
,使其成为易于操作的设计。
- React的状态管理(
- 用户行动
- 您可以使用按钮切换动画并实时播放选定的动画。
最后
使用React和三个JS生成的GLB格式的控制3D模型的所有步骤均已完成。现在,您可以体验使用使用AI工具(Meshy)使用React和Trix.js生成的3D模型的乐趣!
使用Meshy查看各种3D型号!
📺在YouTube上观看演示:链接中观看
如果您发现本教程有帮助,请订阅我们的YouTube频道并给予高评分!

此外,该项目的源代码可在GitHub上获得。
请下载代码并尝试!
💾github存储库:此链接中检查源代码
如果您发现这有用,请订阅我们的频道!
将来,我们将继续创建课程,并从打字稿x进行三个反应三个光纤!
我们将在YouTube上发布公告,因此请订阅我们的YouTube频道并等待通知!
📺观看YouTube :您可以从此链接
如果您想知道三个纤维可以做什么反应,请参考以下内容!
我们有易于使用的作品!