🚀
React+TypeScriptなWebアプリで、R3Fのtutorial19。(Annotationsで注釈表示)
Abstract
今回の参考はここ(Annotation)。
やってみた。
結論
今回の成果物はココ↓
アノテーションとは
道路標識みたいなせ目的地とかを空間上に表示する機能。
前提
- React+Typescriptの開発環境は構築済 [環境構築]WindowsにVSCode+React+TypeScriptの開発環境を構築してみた。
- このスケルトンコードから始める。react-r3f-tutorial010
手順
1.プロジェクト生成 -> VSCodeで開く
めんどいから、このスケルトンコードから始める。react-r3f-tutorial010
で、下記コマンドでフォルダ名とか整備する。
フォルダリネームとか
$ D:
$ cd .\Products\React.js\ # ご自身の適当なフォルダで。
$ rd /q /s D:\Products\React.js\react-r3f-advanced010
$ git clone https://github.com/aaaa1597/react-r3f-tutorial010.git
$ rd /q /s react-r3f-tutorial010/.git
$ ren react-r3f-tutorial010 react-r3f-advanced019
$ cd react-r3f-advanced019
準備
$ npm install --save three
$ npm install --save @types/three
$ npm install --save @react-three/fiber
$ npm install --save @react-three/drei
.eslintrc.jsを修正
エラーになるので、ignoreに追加
.eslintrc.js
- "react/no-unknown-property": ['error', { ignore: ['css', "args", 'wireframe', 'rotation-x', 'rotation'] }],
+ "react/no-unknown-property": ['error', { ignore: ['css', "args", 'wireframe', 'rotation-x', 'rotation', 'roughness', 'emissive'] }],
App.css
App.css
+.annotation {
+ background: #181c20;
+ color: #fcf2f4;
+ padding: 10px 15px;
+ border-radius: 15px;
+ font-family: var(--leva-fonts-mono);
+}
+
+.content {
+ padding-top: 10px;
+ transform: translate3d(calc(50% + 4px), 0, 0);
+ text-align: left;
+ background: #202035;
+ color: white;
+ padding: 10px 15px;
+ border-radius: 5px;
+}
App.tsx
まず全体。
App.tsx
import React, {useRef} from 'react';
import './App.css';
import { Canvas, useFrame, MeshProps } from '@react-three/fiber'
import * as THREE from 'three'
-import { OrbitControls, Environment } from '@react-three/drei'
+import { OrbitControls, Environment, Html } from '@react-three/drei'
const Box = (props: MeshProps) => {
const ref = useRef<THREE.Mesh>(null!)
useFrame((_, delta) => {
if( !ref.current) return
ref.current.rotation.x += 1 * delta
ref.current.rotation.y += 0.5 * delta
})
return (
<mesh {...props} ref={ref}>
<boxGeometry />
+ <meshStandardMaterial roughness={0.75} emissive="#404057" />
- <meshNormalMaterial />
+ <Html distanceFactor={3} position={new THREE.Vector3(1.2, 1.2, 1.2)}>
+ <div className="content">
+ Boxにannotation
+ </div>
+ </Html>
+ <arrowHelper args={[new THREE.Vector3(-1, -1, -1).normalize(), new THREE.Vector3(1.2, 1.2, 1.2), Math.sqrt(1.1), "red", 0.5]} />
</mesh>
)
}
const App = () => {
return (
<div style={{ width: "75vw", height: "75vh" }}>
<Canvas camera={{ position: [3, 1, 2] }}>
<Box position={[1, 1, 1]} name="A" />
<Environment preset="forest" background />
+ <Html key={112} position={[0.7, 1, 0]} className="annotation" style={{width:180}} transform distanceFactor={3}>
+ 空間にアノテーション
+ </Html>
<OrbitControls />
<axesHelper args={[5]} />
<gridHelper />
</Canvas>
</div>
);
}
export default App;
で、実行。
出来た!!
ポイント
- Htmlをimportする。
App.tsx
import { Html } from '@react-three/drei'
- <Html></Html>タグを埋め込む。
classNameで、クラス名つけとくと、cssで見た目を設定できる。
App.tsx
<Html key={112} position={[0.7, 1, 0]} className="annotation" style={{width:180}} transform distanceFactor={3}>
空間にアノテーション
</Html>
意外と簡単だった。
React+TypeScriptなWebアプリで、R3Fのtutorial18。(GLTFJSXでモデル制御)
React+TypeScriptなWebアプリで、R3Fのtutorial19。(Custom Hooksで自作イベント)
React+TypeScriptなWebアプリで、R3Fのtutorial20。(Lerpで簡単移動処理) 簡単な移動処理を攻略する。
Discussion