• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Component3D
2<!--Kit: ArkUI-->
3<!--Subsystem: ArkUI-->
4<!--Owner: @zzhao0-->
5<!--Designer: @zdustc-->
6<!--Tester: @zhangyue283-->
7<!--Adviser: @ge-yafang-->
8
93D渲染组件,可以加载3D模型资源并做自定义渲染,通常用于3D动效场景。
10
11>  **说明:**
12>
13>  该组件从API Version 12开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
14
15## 子组件
16
1718
19
20## 接口
21
22Component3D(sceneOptions?: SceneOptions)
23
24**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
25
26**系统能力:** SystemCapability.ArkUi.Graphics3D
27
28**参数:**
29
30| 参数名       | 类型                                  | 必填 | 说明                                                         |
31| ------------ | ------------------------------------- | ---- | ------------------------------------------------------------ |
32| sceneOptions | [SceneOptions](#sceneoptions对象说明) | 否   | 3D场景配置选项。<br/>**说明:** <br/> 3D场景配置选项在控件创建后不支持动态修改。 |
33
34
35## SceneOptions对象说明
36
37Component3D组件配置选项。
38
39**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
40
41**系统能力:** SystemCapability.ArkUi.Graphics3D
42
43| 名称        | 类型                               | 只读 | 可选   | 说明                                       |
44| --------- | -------------------------------- | ---- | ---- | ---------------------------------------- |
45| scene     | [ResourceStr](ts-types.md#resourcestr)&nbsp;\|&nbsp;[Scene](#scene12) | 否    | 是    | 3D模型资源文件或场景对象,默认值为undefined。<br/>**说明:** <br/>目前仅支持GLTF格式资源。 |
46| modelType | [ModelType](#modeltype枚举说明) | 否    | 是    | 3D场景显示合成方式。<br/>默认值:ModelType.SURFACE<br/>**说明:** <br/>设置为ModelType.TEXTURE时通过GPU合成显示。<br/>设置为ModelType.SURFACE时通过专有硬件合成显示。<br/>一般开发者可以使用默认值而无需关心此项设置。 |
47
48## ModelType枚举说明
49
50渲染合成模式类型枚举,用于指定3D场景的渲染输出方式。
51
52**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
53
54**系统能力:** SystemCapability.ArkUi.Graphics3D
55
56| 名称    | 值   | 说明                     |
57| ------- | ---- | ------------------------ |
58| TEXTURE | 0 | 使用GPU合成显示3D场景。 |
59| SURFACE | 1 | 使用专有硬件显示3D场景。 |
60
61## Scene<sup>12+</sup>
62
63type Scene = Scene
64
65设置3D场景。
66
67**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
68
69**系统能力:** SystemCapability.ArkUi.Graphics3D
70
71| 类型                                                         | 说明           |
72| ------------------------------------------------------------ | -------------- |
73| [Scene](../../apis-arkgraphics3d/js-apis-inner-scene.md#scene-1) | 用于设置场景。 |
74
75## 属性
76
77除支持[通用属性](ts-component-general-attributes.md)外,还支持以下属性:
78
79### environment
80
81environment(uri: ResourceStr)
82
83设置3D环境资源。目前仅支持GLTF格式资源,模型资源在控件创建后不支持动态修改。
84
85**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
86
87**系统能力:** SystemCapability.ArkUi.Graphics3D
88
89**参数:**
90
91| 参数名 | 类型                                   | 必填 | 说明         |
92| ------ | -------------------------------------- | ---- | ------------ |
93| uri    | [ResourceStr](ts-types.md#resourcestr) | 是   | 3D环境资源。 |
94
95### customRender
96
97customRender(uri: ResourceStr, selfRenderUpdate: boolean)
98
99设置三维场景渲染的渲染管道。管线配置及自渲染属性在控件创建后不支持动态修改。
100
101**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
102
103**系统能力:** SystemCapability.ArkUi.Graphics3D
104
105**参数:**
106
107| 参数名           | 类型                                   | 必填 | 说明                                                         |
108| ---------------- | -------------------------------------- | ---- | ------------------------------------------------------------ |
109| uri              | [ResourceStr](ts-types.md#resourcestr) | 是   | 自定义渲染管线的配置文件。                                   |
110| selfRenderUpdate | boolean                                | 是   | 当设置为true时外部UI没有更新时也能触发动效渲染。<br/>当设置为false时只有外部UI更新才能触发渲染。 |
111
112### shader
113
114shader(uri: ResourceStr)
115
116设置自定义渲染的shader文件资源。自定义渲染的shader文件资源在控件创建后不支持动态修改。
117
118**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
119
120**系统能力:** SystemCapability.ArkUi.Graphics3D
121
122**参数:**
123
124| 参数名 | 类型                                   | 必填 | 说明                         |
125| ------ | -------------------------------------- | ---- | ---------------------------- |
126| uri    | [ResourceStr](ts-types.md#resourcestr) | 是   | 自定义渲染的shader文件资源。详细`.shader`文件格式请参考[.shader资源文件格式要求](../../../graphics3d/arkgraphics3D-shader-resource.md)。 |
127
128### shaderImageTexture
129
130shaderImageTexture(uri: ResourceStr)
131
132设置自定义渲染用到的纹理资源。若自定义渲染用到多个纹理资源则调用多次,绑定点与调用顺序一致,不支持纹理更换。纹理资源在控件创建后不支持动态修改。
133
134**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
135
136**系统能力:** SystemCapability.ArkUi.Graphics3D
137
138**参数:**
139
140| 参数名 | 类型                                   | 必填 | 说明                       |
141| ------ | -------------------------------------- | ---- | -------------------------- |
142| uri    | [ResourceStr](ts-types.md#resourcestr) | 是   | 自定义渲染用到的纹理资源。 |
143
144### shaderInputBuffer
145
146shaderInputBuffer(buffer: Array&lt;number&gt;)
147
148设置自定义渲染用到的动效参数。
149
150**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
151
152**系统能力:** SystemCapability.ArkUi.Graphics3D
153
154**参数:**
155
156| 参数名 | 类型           | 必填 | 说明                       |
157| ------ | -------------- | ---- | -------------------------- |
158| buffer | Array<number\> | 是   | 自定义渲染用到的动效参数,数组长度范围为[0, 1048576]。 |
159
160### renderWidth
161
162renderWidth(value: Dimension)
163
164设置3D渲染分辨率的宽度。渲染分辨率的长宽可以不同于控件的长宽,若渲染分辨率与控件分辨率长宽不一致时会上采样或下采样到控件长宽。
165
166不调用此属性时默认渲染分辨率。
167
168渲染分辨率在控件创建后不支持动态修改。
169
170**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
171
172**系统能力:** SystemCapability.ArkUi.Graphics3D
173
174**参数:**
175
176| 参数名 | 类型                                 | 必填 | 说明                 |
177| ------ | ------------------------------------ | ---- | -------------------- |
178| value  | [Dimension](ts-types.md#dimension10) | 是   | 3D渲染分辨率的宽度,当前仅支持设置Dimension.Percetage,取值范围是[0, 100%]。 |
179
180### renderHeight
181
182renderHeight(value: Dimension)
183
184设置3D渲染分辨率的长度。渲染分辨率的长宽可以不同于控件的长宽,若渲染分辨率与控件分辨率长宽不一致时会上采样或下采样到控件长宽。
185
186不调用此属性时默认渲染分辨率。
187
188渲染分辨率在控件创建后不支持动态修改。
189
190**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
191
192**系统能力:** SystemCapability.ArkUi.Graphics3D
193
194**参数:**
195
196| 参数名 | 类型                                 | 必填 | 说明                 |
197| ------ | ------------------------------------ | ---- | -------------------- |
198| value  | [Dimension](ts-types.md#dimension10) | 是   | 3D渲染分辨率的长度,当前仅支持设置Dimension.Percetage,取值范围是[0, 100%]。 |
199
200## 事件
201
202支持[通用事件](ts-component-general-events.md)。
203
204## 示例
205示例效果请以真机运行为准,当前DevEco Studio预览器不支持。<br/>
206GLTF模型加载示例。 <br/>
207```ts
208// xxx.ets
209@Entry
210@Component
211struct Index {
212  scene: SceneOptions = { scene: $rawfile('gltf/DamagedHelmet/glTF/DamagedHelmet.gltf'), modelType: ModelType.SURFACE};
213  build() {
214    Row() {
215      Column() {
216        Text('GLTF Example')
217        Component3D( this.scene )
218          .environment($rawfile('gltf/Environment/glTF/Environment.gltf'))
219          .renderWidth('90%').renderHeight('90%')
220      }.width('100%')
221    }
222    .height('100%')
223  }
224}
225```
226自定义渲染示例。 <br/>
227
228```ts
229import { AnimatorResult } from '@kit.ArkUI';
230
231class EngineTime {
232  totalTimeUs = 0;
233  deltaTimeUs = 0;
234};
235
236let engineTime = new EngineTime();
237let frameCount: number = 0;
238
239function TickFrame() {
240  if (frameCount == 10) {
241    engineTime.totalTimeUs += 1.0;
242    engineTime.deltaTimeUs += 1.0;
243    frameCount = 0;
244  } else {
245    frameCount++;
246  }
247}
248
249@Entry
250@Component
251struct Index {
252  scene: SceneOptions = { scene: $rawfile('gltf/DamagedHelmet/glTF/DamagedHelmet.gltf'), modelType: ModelType.SURFACE};
253  backAnimator: AnimatorResult = this.getUIContext().createAnimator({
254    duration: 2000,
255    easing: "ease",
256    delay: 0,
257    fill: "none",
258    direction: "normal",
259    iterations: -1,
260    begin: 100,
261    end: 200,
262  });
263  @State timeDelta: number[] = [1.0, 2.0];
264  create() {
265    this.backAnimator.onFinish = () => {
266      console.log('backAnimator onfinish');
267    }
268    this.backAnimator.onFrame = (value: number) => {
269      TickFrame();
270      this.timeDelta[0] = engineTime.deltaTimeUs;
271    }
272
273  }
274  build() {
275    Row() {
276      Column() {
277        Text('custom rendering')
278        Component3D()
279          .shader($rawfile('assets/app/shaders/shader/London.shader'))
280          .shaderImageTexture($rawfile('assets/London.jpg'))
281          .shaderInputBuffer(this.timeDelta)
282          .customRender($rawfile('assets/app/rendernodegraphs/London.rng'), true)
283          .renderWidth('90%').renderHeight('90%')
284          .onAppear(() => {
285            this.create();
286            this.backAnimator.play();
287          }).width('50%').height('50%')
288      }.width('100%')
289    }
290    .height('100%')
291  }
292}
293```