投稿日:2022-11-23
#Grasshopper
#Three.js
#R3F
#Basic
今回は、Grasshopper で作成した Rhino を、React Three Fiber(Three.js を React を使用して実装できるライブラリ)を使って Web ブラウザで表示していきたいと思います。React Three Fiber を使用すると、Vanilla.js で実装するよりもだいぶ楽にはなります。ただし、Vanilla.js で実装できないと、かなりブラックボックスになってしまうのと、複雑なことをやろうとすると難しいことが多々出てきますのでその辺りは要注意です。ソースコードは
にアップしてます。
今回ブラウザで表示するのは、以前 Grasshopper と Monoceros というプラグインを使用して作成したモデルを使用します。作り方、ご興味あれば以下のリンクからのぞいてみてください。 こちらのデータはメッシュ化した後、join して単一メッシュにしていおります。この状態で現状 18MB あります。ブラウザに持っていくにはちょっと重たいですね。 このままではロード時間もかかってしまうので、まずはこちらのモデルを軽量化していきます。
ひとまず Rhino 上でできることは限られているので、モデルを Blender に移行しましょう。Blender はオープソースですので、誰でも無料で使用することができるソフトウェアとなっております。インストールは
からできます。
まずは Rhinoceros から、モデルを FBX 形式でエクスポートします。
1npx create-react-app myapp 2cd myapp 3npm start
1 npm install three @react-three/fiber 2 npm install three@0.146 @react-three/fiber@8.9.1
1import "./App.css"; 2import { Canvas } from "@react-three/fiber"; 3 4function App() { 5 return ( 6 <> 7 <Canvas style={{ width: "100vw", height: "100vh" }}> 8 <mesh> 9 <sphereGeometry /> 10 <meshNormalMaterial /> 11 </mesh> 12 </Canvas> 13 </> 14 ); 15} 16 17export default App;
1npm install @react-three/drei
1import "./App.css"; 2import { Canvas } from "@react-three/fiber"; 3import { useGLTF } from "@react-three/drei"; 4 5function App() { 6 const model = useGLTF("/model/pipe.glb"); 7 8 return ( 9 <> 10 <Canvas style={{ width: "100vw", height: "100vh" }}> 11 <primitive object={model.scene} /> 12 </Canvas> 13 </> 14 ); 15} 16 17export default App;
1import "./App.css"; 2import { Canvas } from "@react-three/fiber"; 3import { useGLTF } from "@react-three/drei"; 4 5function App() { 6 const model = useGLTF("/model/pipe.glb"); 7 8 return ( 9 <> 10 <Canvas 11 style={{ width: "100vw", height: "100vh", background: "#333" }} 12 camera={{ 13 fov: 75, 14 near: 0.1, 15 far: 200, 16 position: [0, 5, 10], 17 }} 18 > 19 <directionalLight position={[0, 10, 0]} intensity={1.0} /> 20 <primitive object={model.scene} /> 21 </Canvas> 22 </> 23 ); 24} 25 26export default App;
1import "./App.css"; 2import { Canvas } from "@react-three/fiber"; 3import { OrbitControls, useGLTF } from "@react-three/drei"; 4 5function App() { 6 const model = useGLTF("/model/pipe.glb"); 7 8 return ( 9 <> 10 <Canvas 11 style={{ width: "100vw", height: "100vh", background: "#333" }} 12 camera={{ 13 fov: 75, 14 near: 0.1, 15 far: 200, 16 position: [0, 5, 10], 17 }} 18 > 19 <directionalLight position={[0, 10, 0]} intensity={1.0} /> 20 <OrbitControls makeDefault /> 21 <primitive object={model.scene} /> 22 </Canvas> 23 </> 24 ); 25} 26 27export default App;
1import "./App.css"; 2import { Canvas } from "@react-three/fiber"; 3import { Environment, OrbitControls, useGLTF } from "@react-three/drei"; 4import * as THREE from "three"; 5 6function App() { 7 const model = useGLTF("/model/pipe.glb"); 8 Object.keys(model.materials).forEach((key) => { 9 const material = model.materials[key]; 10 material.roughness = 1.0; 11 material.color = new THREE.Color("#008b8b"); 12 }); 13 14 return ( 15 <> 16 <Canvas 17 style={{ width: "100vw", height: "100vh", background: "#333" }} 18 camera={{ 19 fov: 75, 20 near: 0.1, 21 far: 200, 22 position: [0, 5, 10], 23 }} 24 > 25 <Environment preset="sunset" /> 26 <OrbitControls makeDefault /> 27 <primitive object={model.scene} /> 28 </Canvas> 29 </> 30 ); 31} 32 33export default App;
【参考】