@@ -84,9 +84,8 @@ const handAttachmentComponent: ComponentDefinition = {
84
84
} ,
85
85
}
86
86
87
- const handMesh = ( modelGeometry , material , wireframe ) => {
87
+ const handMesh = ( modelGeometry , material , wireframe , uvOrientation ) => {
88
88
let handKind = 2
89
-
90
89
const geometry = new THREE . BufferGeometry ( )
91
90
92
91
// Fill geometry with default vertices.
@@ -97,22 +96,15 @@ const handMesh = (modelGeometry, material, wireframe) => {
97
96
const normals = new Float32Array ( modelGeometry . pointsPerDetection * 3 )
98
97
geometry . setAttribute ( 'normal' , new THREE . BufferAttribute ( normals , 3 ) )
99
98
100
- // // Add the UVs to the geometry.
101
- // const uvs = new Float32Array(modelGeometry.uvs.length * 2)
102
- // for (let i = 0; i < modelGeometry.uvs.length; ++i) {
103
- // uvs[i * 2] = modelGeometry.uvs[i].u
104
- // uvs[i * 2 + 1] = modelGeometry.uvs[i].v
105
- // }
106
- // geometry.setAttribute('uv', new THREE.BufferAttribute(uvs, 2))
99
+ // Create and set UVs based on uvOrientation
107
100
108
- // By default, using the right hand indices.
101
+ // Instantiate both left and right hand indices as we use them at runtime
109
102
const rightIndices = new Array ( modelGeometry . rightIndices . length * 3 )
110
103
for ( let i = 0 ; i < modelGeometry . rightIndices . length ; ++ i ) {
111
104
rightIndices [ i * 3 ] = modelGeometry . rightIndices [ i ] . a
112
105
rightIndices [ i * 3 + 1 ] = modelGeometry . rightIndices [ i ] . b
113
106
rightIndices [ i * 3 + 2 ] = modelGeometry . rightIndices [ i ] . c
114
107
}
115
- geometry . setIndex ( rightIndices )
116
108
117
109
const leftIndices = new Array ( modelGeometry . leftIndices . length * 3 )
118
110
for ( let i = 0 ; i < modelGeometry . leftIndices . length ; ++ i ) {
@@ -121,6 +113,31 @@ const handMesh = (modelGeometry, material, wireframe) => {
121
113
leftIndices [ i * 3 + 2 ] = modelGeometry . leftIndices [ i ] . c
122
114
}
123
115
116
+ // Construct UVs based on hand mesh orientation
117
+ let uv
118
+ if ( uvOrientation === 'left' ) {
119
+ const leftUvs = new Float32Array ( modelGeometry . leftUvs . length * 2 )
120
+ for ( let i = 0 ; i < modelGeometry . pointsPerDetection ; i ++ ) {
121
+ leftUvs [ 2 * i ] = modelGeometry . leftUvs [ i ] . u
122
+ leftUvs [ 2 * i + 1 ] = modelGeometry . leftUvs [ i ] . v
123
+ }
124
+ const leftUvBuffer = new THREE . BufferAttribute ( leftUvs , 2 )
125
+
126
+ uv = leftUvBuffer
127
+ geometry . setIndex ( leftIndices )
128
+ } else if ( uvOrientation === 'right' ) {
129
+ const rightUvs = new Float32Array ( modelGeometry . rightUvs . length * 2 )
130
+ for ( let i = 0 ; i < modelGeometry . pointsPerDetection ; i ++ ) {
131
+ rightUvs [ 2 * i ] = modelGeometry . rightUvs [ i ] . u
132
+ rightUvs [ 2 * i + 1 ] = modelGeometry . rightUvs [ i ] . v
133
+ }
134
+ const rightUvBuffer = new THREE . BufferAttribute ( rightUvs , 2 )
135
+
136
+ uv = rightUvBuffer
137
+ geometry . setIndex ( rightIndices )
138
+ }
139
+ geometry . setAttribute ( 'uv' , uv )
140
+
124
141
if ( wireframe ) {
125
142
material . wireframe = true
126
143
}
@@ -174,6 +191,7 @@ const handMeshComponent: ComponentDefinition = {
174
191
schema : {
175
192
'material-resource' : { type : 'string' } ,
176
193
'wireframe' : { type : 'boolean' , default : false } ,
194
+ 'uv-orientation' : { type : 'string' , default : 'right' } ,
177
195
} ,
178
196
init ( ) {
179
197
this . handMesh = null
@@ -191,7 +209,7 @@ const handMeshComponent: ComponentDefinition = {
191
209
)
192
210
}
193
211
194
- this . handMesh = handMesh ( detail , material , this . data . wireframe )
212
+ this . handMesh = handMesh ( detail , material , this . data . wireframe , this . data [ 'uv-orientation' ] )
195
213
this . el . setObject3D ( 'mesh' , this . handMesh . mesh )
196
214
197
215
this . el . emit ( 'model-loaded' )
@@ -248,15 +266,15 @@ const handOccluder = (modelGeometry, material, adjustment) => {
248
266
rightIndices [ i * 3 + 1 ] = modelGeometry . rightIndices [ i ] . b
249
267
rightIndices [ i * 3 + 2 ] = modelGeometry . rightIndices [ i ] . c
250
268
}
251
- geometry . setIndex ( rightIndices )
252
-
253
269
const leftIndices = new Array ( modelGeometry . leftIndices . length * 3 )
254
270
for ( let i = 0 ; i < modelGeometry . leftIndices . length ; ++ i ) {
255
271
leftIndices [ i * 3 ] = modelGeometry . leftIndices [ i ] . a
256
272
leftIndices [ i * 3 + 1 ] = modelGeometry . leftIndices [ i ] . b
257
273
leftIndices [ i * 3 + 2 ] = modelGeometry . leftIndices [ i ] . c
258
274
}
259
275
276
+ geometry . setIndex ( rightIndices )
277
+
260
278
const mesh = new THREE . Mesh ( geometry , material )
261
279
262
280
const show = ( { detail} ) => {
0 commit comments