关于 tresjs-core-skilld
tresjs-core-skilld 介绍 @tresjs/core,这是面向 Three.js 的 Vue 自定义渲染器,可将 Three.js 类映射为 Vue 组件。它适用于构建 3D 场景的 Vue 开发者,提供场景渲染、模型加载、动画和指针事件相关组件与组合式函数。
主要功能
- 01将 Three.js 对象渲染为 Vue 组件
- 02使用 TresCanvas 创建场景
- 03通过 useLoader 加载资源
- 04通过 useLoop 运行动画
- 05处理 3D 对象的指针事件
- 06控制渲染模式和帧率
适用场景
- 01在 Vue 应用中构建 Three.js 场景
- 02加载并显示 GLTF 模型
- 03在渲染循环中为场景对象制作动画
- 04响应对网格对象的指针交互
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ skilld-dev/ vue-ecosystem-skills --skill tresjs-core-skilld安装后在 Claude Code 中输入/tresjs-core-skilld确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/components.mdcomposables.mdmigration-v4-v5.mdperformance.mdpointer-events.mdwebgpu.md详细介绍
@tresjs/core 5.9.0
Three.js 的 Vue 自定义渲染器:为任何 THREE 类添加前缀 Tres,即可将其作为组件使用(<TresMesh>、<TresBoxGeometry>)。已准备的源文件:package.json、dist/tres.d.ts(公共类型)、dist/tres.js。
生成时的 npm dist-tag:latest 5.9.0、rc 5.0.0-rc.0、next 5.0.0-next.6、beta 2.0.0-beta.13、alpha 5.0.0-alpha.2。
环境限制
- 自 v5 起仅支持 ESM。不提供 UMD,也不支持
require()。import { TresCanvas } from '@tresjs/core'。 - Peer 依赖:
vue >=3.4、three >=0.133(package.json:44-46)。基于 three^0.184构建。 - 时间源:r179 及更高版本使用 three
Timer,较旧版本的 three 使用Clock(dist/tres.d.ts:962-970)。 - WebGPU 仍处于实验阶段;需要使用
three/webgpu的Renderer作为rendererprop(参见 references/webgpu.md)。
设置
pnpm i @tresjs/core three
pnpm i @types/three -D # TypeScript
Vite:将 templateCompilerOptions 展开传入 Vue 插件,否则 Tres 组件会被警告为未知自定义元素(README.md:36-50):
import { templateCompilerOptions } from '@tresjs/core'
import vue from '@vitejs/plugin-vue'
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [vue({ ...templateCompilerOptions })],
})
另有单独的子路径导出 @tresjs/core/template-compiler-options,供只需要编译器选项的宿主使用(package.json:21-25)。Nuxt 项目请使用 @tresjs/nuxt,而非手动设置。
核心模型
- 组件目录根据
THREE命名空间自动生成:类名首字母大写并加上Tres前缀,也支持 kebab-case(<tres-mesh>,自 v5.1.0 起支持)(dist/tres.d.ts:497-509)。 args用于传递构造函数参数:<TresBoxGeometry :args="[1, 2, 3]" />。更改响应式args会重新创建整个实例;对于构造后可设置的属性,请使用 props(dist/tres.d.ts:405-411)。- Props 会映射到实例属性。数学类型支持简写:
:position="[1, 2, 3]"、:rotation="[0, Math.PI, 0]"、color="#00ff00"(dist/tres.d.ts:457-485)。 - 子级材质和几何体会通过
attach自动附加:<TresMesh><TresBoxGeometry /><TresMeshNormalMaterial /></TresMesh>无需显式指定attach即可运行。 - 将非 THREE 类用作
<TresMyObject>前,先调用extend({ MyObject })(dist/tres.d.ts:872-874)。 <primitive :object="existingThreeObject" />会挂载你在 JS 中创建的对象。它不负责释放对象;请手动释放(参见 references/performance.md)。
最简场景:
<script setup lang="ts">
import { TresCanvas } from '@tresjs/core'
</script>
<template>
<TresCanvas shadows>
<TresPerspectiveCamera :position="[3, 3, 3]" :look-at="[0, 0, 0]" />
<TresMesh>
<TresBoxGeometry :args="[1, 1, 1]" />
<TresMeshNormalMaterial />
</TresMesh>
<TresDirectionalLight :position="[3, 3, 3]" :intensity="1" cast-shadow />
</TresCanvas>
</template>
如果未显式指定相机,系统会创建默认的 PerspectiveCamera(dist/tres.d.ts:682-685)。
需要了解的 API 变更
v5 破坏性变更(请参照 references/migration-v4-v5.md 进行迁移):
useLoader返回响应式状态{ state, isLoading, error, progress, load },不再返回 Promise(dist/tres.d.ts:40-65)。- 指针事件使用原生 DOM 名称:使用
@pointerdown,而不是@pointer-down。只有第一个相交对象会触发事件。 useTexture已移至@tresjs/cientos。useRenderLoop、useCamera、useSeek、useRaycaster、useTresReady、useTresEventManager、useLogger已移除。替代方案:useLoop、useTres、useGraph、@ready事件。useTresContext().camera是相机管理器;使用useTres().camera获取当前激活的相机实例(dist/tres.d.ts:574-606)。- WebGL 上下文属性(
alpha、antialias、depth、stencil、powerPreference、logarithmicDepthBuffer、preserveDrawingBuffer、failIfMajorPerformanceCaveat)为只读;请在挂载时一次性设置(dist/tres.d.ts:141-206)。
近期新增:
- 5.9.0:
TresPortal组件可将子项重新挂载到任意Object3D/Scene目标(dist/tres.d.ts:853-858),https://docs.tresjs.org/api/components/tres-portal - 5.9.0:
isWebGPURenderer守卫和响应式context.isWebGPU标志(dist/tres.d.ts:350-367, 1204-1222) - 5.9.0:在 WebGL 上,
shadowMapType默认为PCFShadowMap;在 WebGPU 上默认为PCFSoftShadowMap(dist/tres.d.ts:250-255) - 5.8.0:
fpsLimit属性可限制渲染 FPS(dist/tres.d.ts:692-696) - 5.7.0:通过
Timer回退到Clock,兼容<r179版本的 three(dist/tres.d.ts:962-970) - 5.5.0:
TresCanvasContext(Context组件),用于使用自有的<canvas>(dist/tres.d.ts:680-708) - 5.3.0:
customRendererOptions.primitivePrefix可重命名<primitive>(dist/tres.d.ts:622-625) - 5.2.0:导出
TresCanvasProps/TresCanvasEmits类型(dist/tres.d.ts:776-781) - 完整历史记录:https://github.com/Tresjs/tres/blob/main/packages/core/CHANGELOG.md
常见任务
使用帧率无关的方式进行动画(delta 的单位为秒):
<script setup lang="ts">
import { useLoop } from '@tresjs/core'
const { onBeforeRender } = useLoop()
const cube = shallowRef<TresInstance | null>(null)
onBeforeRender(({ delta, elapsed }) => {
if (!cube.value) return
cube.value.rotation.y += delta * 2 // 2 rad/s on any refresh rate
cube.value.position.y = Math.sin(elapsed * 3) * 0.5
})
</script>
<template>
<TresMesh ref="cube">
<TresBoxGeometry :args="[1, 1, 1]" />
<TresMeshNormalMaterial />
</TresMesh>
</template>
useLoop 只能在 TresCanvas 的子组件中使用;在画布本身上,请使用 @before-loop / @loop 事件(https://docs.tresjs.org/api/composables/use-loop)。
加载模型:
import { useLoader } from '@tresjs/core'
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'
const { state: model, isLoading, error, progress } = useLoader(
GLTFLoader,
'/models/duck.gltf', // MaybeRef<string>: changing the ref reloads
{ extensions: (loader) => loader.setDRACOLoader(dracoLoader) },
)
// template: <primitive v-if="!isLoading && model?.scene" :object="model.scene" />
点击网格:
<TresMesh @click="(e) => e.object.material.color.set('#ff0000')">
<TresBoxGeometry />
<TresMeshNormalMaterial />
</TresMesh>
事件载荷包含 point、object、distance、face、uv、xy。TresCanvas 上的 @pointermissed 可捕获点击空白区域的事件。详情请参阅:references/pointer-events.md。
最佳实践
- 对 Three.js 实例的模板引用,以及传入
<primitive>的任何对象,使用shallowRef;深层ref代理会实实在在地占用帧时间。https://docs.tresjs.org/api/advanced/performance - 对非游戏场景,优先使用
renderMode="on-demand"和invalidate();需要完全控制时,使用renderMode="manual"和advance()(dist/tres.d.ts:134-139)。 - 在
on-demand模式下,通过引用修改对象后,请调用invalidate(),因为这些修改会绕过 Vue 响应式系统。 - 仅在后期处理或多通道渲染时使用
useLoop().render(fn)接管渲染;fn必须调用notifySuccess(),否则渲染模式会失效(https://docs.tresjs.org/api/composables/use-loop)。 - 通过
onBeforeRender/onRender的priority参数注册有顺序的更新(默认值为 0,值越大执行得越晚)。 - 对于已加载的 GLTF 场景,
useGraph(object)可提供按名称索引的nodes、materials、meshes映射,无需手动遍历(dist/tres.d.ts:565)。 - 对通过
<primitive>使用的程序化创建对象,请调用dispose()(从@tresjs/core导出);通过模板创建的对象会自动释放。 - 除非要重新创建实例,否则请保持
args静态;应通过属性或引用执行动画。 - 使用
v-log/v-log:material、v-light-helper、v-distance-to指令进行调试(dist/tres.d.ts:934-952),https://docs.tresjs.org/api/utils/directives
参考资料
- references/components.md:TresCanvas 属性和事件、TresCanvasContext、TresPortal、UseLoader 组件
- references/composables.md:useTres 与 useTresContext、useLoop、useLoader、useGraph、管理器组合式函数
- references/performance.md:渲染模式、响应性、释放资源、dpr、fpsLimit
- references/pointer-events.md:事件名称、命中规则、载荷、传播
- references/webgpu.md:自定义渲染器工厂、isWebGPU、能力分支
- references/migration-v4-v5.md:v4 到 v5 的迁移详情