事件与交互
User Interaction(用户交互)
任何具有 raycast 方法的 Object3D 元素都可以接收大量事件,例如mesh。
<mesh
onClick={(e) => console.log('click')}
onContextMenu={(e) => console.log('context menu')}
onDoubleClick={(e) => console.log('double click')}
onWheel={(e) => console.log('wheel spins')}
onPointerUp={(e) => console.log('up')}
onPointerDown={(e) => console.log('down')}
onPointerOver={(e) => console.log('over')}
onPointerOut={(e) => console.log('out')}
onPointerEnter={(e) => console.log('enter')}
onPointerLeave={(e) => console.log('leave')}
onPointerMove={(e) => console.log('move')}
onPointerMissed={() => console.log('missed')}
onUpdate={(self) => console.log('props have been updated')}
/>
从这里我们可以看出,我们需要做的是使用我们能在任何 DOM 元素上使用的 onClick 事件来响应用户点击mesh。(但是其实对mesh起作用的click事件是另外封装的)
例子
这个教程中我们做了这么几件事:
- 给mesh添加了click事件
- 通过useState,给mesh添加了一个状态的判定逻辑
- 依据state来改变mesh的缩放
我们试着添加一下:
<mesh onClick={() => alert('Hellooo')} ref={myMesh}>
<boxGeometry />
<meshPhongMaterial color="royalblue" />
</mesh>
我们做到了!我们创建了 3D 故事中最无聊的交互,并使alert出现。现在让我们实际上让它给我们的mesh加上动画效果。
让我们首先设置一些状态来检查来判定mesh是否处于active状态:
const [active, setActive] = useState(false)
在拥有这个之后,我们可以使用三元运算符来设置比例,如下所示:
<mesh scale={active ? 1.5 : 1} onClick={() => setActive(!active)} ref={myMesh}>
<boxGeometry />
<meshPhongMaterial color="royalblue" />
</mesh>
如果你现在尝试去点击它,这个mesh会放大或者缩小!我们刚刚完成了我们第一个可交互的三维mesh。
Next Steps 接下来
我们刚刚让我们的mesh对用户交互做出了反应,但是没有任何过渡,看起来相当单调,对吧?在后面的教程中,我们可以将 react-spring 集成到我们的项目中,将其变成实际动画。