CodePenでesm.shでお手軽にReact Three Fiberを使用してみるテスト2 3Dモデル表示
前回からのつづきです。 esm.shを使用したCodePenのコードで、React Three FiberによるglTFファイル形式3Dモデルの表示を行ってみました。
概要
githack経由でglTFファイル形式3Dモデルを読み込んで3Dモデルを表示させています。 読み込んでいるglTFファイルには .glb と .gltf の2種類の拡張子があります。 また、前回からReact Three Fiberのバージョンを、使用するreact-three/dreiのバージョンに合わせて変更しています。
Test01からTest09までのコードは基本的には全て同じコードで、表示させる3Dモデルによって読み込むglTFファイルを修正しているだけです。 他には、3Dモデルの位置・サイズ、3Dモデルのマウス連動の回転の仕方、といったあたりをコードごとに微調整しているぐらいです。
参考:import文そのままになりますが、使用したライブラリ等のバージョンは以下になります
基本的には上記にも書いたように、使用するreact-three/dreiのバージョン
react-three/drei@9.105.4
を基準に、それが動くように
react-three/fiber@8.16.1
を選定しています。 後はthree等、前回と同じバージョンとなっています。
import ReactDOM from 'https://esm.sh/react-dom@18.2.0'
import React, { useRef, useState, Suspense } from 'https://esm.sh/react@18.2.0'
import { GLTFLoader } from 'https://esm.sh/three@0.163.0/examples/jsm/loaders/GLTFLoader'
import { Canvas, useFrame, useLoader } from 'https://esm.sh/@react-three/fiber@8.16.1'
import { Html, useProgress } from 'https://esm.sh/@react-three/drei@9.105.4'
また、3Dモデルの読み込みのために以下のサイトを参考にさせていただきました。
このnoteのそれぞれのコードの下にある参考サイトとして引用している自分noteは、参考にした自作CodeSandboxコードへのリンクをまとめただけのものです。 それらCodeSandboxコードはこのnoteのコード作成時に参考にしましたが、重いのでコードへの直接のリンクはやめておきました。
以下作成したコードのリストとなります。 各コードにて、タイトル文字によるリンクはコード付きCodePenへのリンク、サムネイル画像によるリンクはコードなしのコード実行結果の全画面表示へのリンク、となります。
あと、JavaScriptのコードをそのまま載せているので、冗長な感じでこのnoteエントリけっこう長いです、ご注意ください。
React Three Fiber 8.16.1 glTF Loader Test01
React Three Fiber 8.16.1 glTF Loader Test01
HTML
<div id="root"></div>
CSS
* {
box-sizing: border-box;
}
html,
body,
#root {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
body {
background: #f0f0f0;
}
JS(JavaScript)
import ReactDOM from 'https://esm.sh/react-dom@18.2.0'
import React, { useRef, useState, Suspense } from 'https://esm.sh/react@18.2.0'
import { GLTFLoader } from 'https://esm.sh/three@0.163.0/examples/jsm/loaders/GLTFLoader'
import { Canvas, useFrame, useLoader } from 'https://esm.sh/@react-three/fiber@8.16.1'
import { Html, useProgress } from 'https://esm.sh/@react-three/drei@9.105.4'
const Loader = () => {
const { progress } = useProgress()
return (
<Html center>
{progress} % loaded
</Html>
)
}
const Model = (props) => {
const gltf = useLoader(
GLTFLoader,
'https://raw.githack.com/KhronosGroup/glTF-Sample-Models/master/2.0/2CylinderEngine/glTF-Binary/2CylinderEngine.glb'
)
useFrame((state) => {
gltf.scene.rotation.x += 0.01
//gltf.scene.rotation.x = state.mouse.x * 5
//gltf.scene.rotation.y = state.mouse.y * 5
//gltf.scene.rotation.z = (state.mouse.x + state.mouse.y) / 2 * 5
}, [])
return (
<>
<primitive object={gltf.scene} position={props.position} scale={props.scale} />
</>
)
}
const App = () => {
return (
<Canvas>
<ambientLight intensity={Math.PI / 2} />
<spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} decay={0} intensity={Math.PI} />
<pointLight position={[-10, -10, -10]} decay={0} intensity={Math.PI} />
<Suspense fallback={<Loader />}>
<Model position={[0, 0.3, 0]} scale={0.009} />
</Suspense>
</Canvas>
)
}
ReactDOM.render(
<App/>,
document.getElementById("root")
);
前に自分で作成した以下のサイトの記録を参考にして作成してみました
CodeSandboxでReact Three Fiber実験その3 glTF 3Dモデル表示 > React Three Fiber Practice17 glTF Model03
React Three Fiber 8.16.1 glTF Loader Test02
React Three Fiber 8.16.1 glTF Loader Test02
HTML Test01と同じです
CSS Test01と同じです
JS(JavaScript)
import ReactDOM from 'https://esm.sh/react-dom@18.2.0'
import React, { useRef, useState, Suspense } from 'https://esm.sh/react@18.2.0'
import { GLTFLoader } from 'https://esm.sh/three@0.163.0/examples/jsm/loaders/GLTFLoader'
import { Canvas, useFrame, useLoader } from 'https://esm.sh/@react-three/fiber@8.16.1'
import { Html, useProgress } from 'https://esm.sh/@react-three/drei@9.105.4'
const Loader = () => {
const { progress } = useProgress()
return (
<Html center>
{progress} % loaded
</Html>
)
}
const Model = (props) => {
const gltf = useLoader(
GLTFLoader,
'https://raw.githack.com/KhronosGroup/glTF-Sample-Models/master/2.0/DamagedHelmet/glTF-Binary/DamagedHelmet.glb'
)
useFrame((state) => {
//gltf.scene.rotation.x += 0.01
gltf.scene.rotation.x = state.mouse.x * 5
gltf.scene.rotation.y = state.mouse.y * 5
gltf.scene.rotation.z = (state.mouse.x + state.mouse.y) / 2 * 5
}, [])
return (
<>
<primitive object={gltf.scene} position={props.position} scale={props.scale} />
</>
)
}
const App = () => {
return (
<Canvas>
<ambientLight intensity={Math.PI / 2} />
<spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} decay={0} intensity={Math.PI} />
<pointLight position={[-10, -10, -10]} decay={0} intensity={Math.PI} />
<Suspense fallback={<Loader />}>
<Model position={[0, 0.8, 0]} scale={2.5} />
</Suspense>
</Canvas>
)
}
ReactDOM.render(
<App/>,
document.getElementById("root")
);
前に自分で作成した以下のサイトの記録を参考にして作成してみました
CodeSandboxでReact Three Fiber実験その3 glTF 3Dモデル表示 > React Three Fiber Practice18 glTF Model04
React Three Fiber 8.16.1 glTF Loader Test03
React Three Fiber 8.16.1 glTF Loader Test03
HTML Test01と同じです
CSS Test01と同じです
JS(JavaScript)
import ReactDOM from 'https://esm.sh/react-dom@18.2.0'
import React, { useRef, useState, Suspense } from 'https://esm.sh/react@18.2.0'
import { GLTFLoader } from 'https://esm.sh/three@0.163.0/examples/jsm/loaders/GLTFLoader'
import { Canvas, useFrame, useLoader } from 'https://esm.sh/@react-three/fiber@8.16.1'
import { Html, useProgress } from 'https://esm.sh/@react-three/drei@9.105.4'
const Loader = () => {
const { progress } = useProgress()
return (
<Html center>
{progress} % loaded
</Html>
)
}
const Model = (props) => {
const gltf = useLoader(
GLTFLoader,
'https://raw.githack.com/KhronosGroup/glTF-Sample-Models/master/2.0/SheenChair/glTF-Binary/SheenChair.glb'
)
useFrame((state) => {
//gltf.scene.rotation.x += 0.01
gltf.scene.rotation.x = state.mouse.x * 5
gltf.scene.rotation.y = state.mouse.y * 5
//gltf.scene.rotation.z = (state.mouse.x + state.mouse.y) / 2 * 5
}, [])
return (
<>
<primitive object={gltf.scene} position={props.position} scale={props.scale} />
</>
)
}
const App = () => {
return (
<Canvas>
<ambientLight intensity={Math.PI / 2} />
<spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} decay={0} intensity={Math.PI} />
<pointLight position={[-10, -10, -10]} decay={0} intensity={Math.PI} />
<Suspense fallback={<Loader />}>
<Model position={[0, -1, 0]} scale={5.5} />
</Suspense>
</Canvas>
)
}
ReactDOM.render(
<App/>,
document.getElementById("root")
);
前に自分で作成した以下のサイトの記録を参考にして作成してみました
CodeSandboxでReact Three Fiber実験その3 glTF 3Dモデル表示 > React Three Fiber Practice19 glTF Model05
React Three Fiber 8.16.1 glTF Loader Test04
React Three Fiber 8.16.1 glTF Loader Test04
HTML Test01と同じです
CSS Test01と同じです
JS(JavaScript)
import ReactDOM from 'https://esm.sh/react-dom@18.2.0'
import React, { useRef, useState, Suspense } from 'https://esm.sh/react@18.2.0'
import { GLTFLoader } from 'https://esm.sh/three@0.163.0/examples/jsm/loaders/GLTFLoader'
import { Canvas, useFrame, useLoader } from 'https://esm.sh/@react-three/fiber@8.16.1'
import { Html, useProgress } from 'https://esm.sh/@react-three/drei@9.105.4'
const Loader = () => {
const { progress } = useProgress()
return (
<Html center>
{progress} % loaded
</Html>
)
}
const Model = (props) => {
const gltf = useLoader(
GLTFLoader,
'https://raw.githack.com/KhronosGroup/glTF-Sample-Models/master/2.0/Buggy/glTF-Binary/Buggy.glb'
)
useFrame((state) => {
//gltf.scene.rotation.x += 0.01
gltf.scene.rotation.x = state.mouse.y * 5
gltf.scene.rotation.y = state.mouse.x * 5
//gltf.scene.rotation.z = (state.mouse.x + state.mouse.y) / 2 * 5
}, [])
return (
<>
<primitive object={gltf.scene} position={props.position} scale={props.scale} />
</>
)
}
const App = () => {
return (
<Canvas>
<ambientLight intensity={Math.PI / 2} />
<spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} decay={0} intensity={Math.PI} />
<pointLight position={[-10, -10, -10]} decay={0} intensity={Math.PI} />
<Suspense fallback={<Loader />}>
<Model position={[-1.2, 0, -3.5]} scale={0.05} />
</Suspense>
</Canvas>
)
}
ReactDOM.render(
<App/>,
document.getElementById("root")
);
前に自分で作成した以下のサイトの記録を参考にして作成してみました
CodeSandboxでReact Three Fiber実験その3 glTF 3Dモデル表示 > React Three Fiber Practice20 glTF Model06
React Three Fiber 8.16.1 glTF Loader Test05
React Three Fiber 8.16.1 glTF Loader Test05
HTML Test01と同じです
CSS Test01と同じです
JS(JavaScript)
import ReactDOM from 'https://esm.sh/react-dom@18.2.0'
import React, { useRef, useState, Suspense } from 'https://esm.sh/react@18.2.0'
import { GLTFLoader } from 'https://esm.sh/three@0.163.0/examples/jsm/loaders/GLTFLoader'
import { Canvas, useFrame, useLoader } from 'https://esm.sh/@react-three/fiber@8.16.1'
import { Html, useProgress } from 'https://esm.sh/@react-three/drei@9.105.4'
const Loader = () => {
const { progress } = useProgress()
return (
<Html center>
{progress} % loaded
</Html>
)
}
const Model = (props) => {
const gltf = useLoader(
GLTFLoader,
'https://raw.githack.com/KhronosGroup/glTF-Sample-Models/master/2.0/Avocado/glTF-Binary/Avocado.glb'
)
useFrame((state) => {
//gltf.scene.rotation.x += 0.01
gltf.scene.rotation.x = state.mouse.y * 5
gltf.scene.rotation.y = state.mouse.x * 5
//gltf.scene.rotation.z = (state.mouse.x + state.mouse.y) / 2 * 5
}, [])
return (
<>
<primitive object={gltf.scene} position={props.position} scale={props.scale} />
</>
)
}
const App = () => {
return (
<Canvas>
<ambientLight intensity={Math.PI / 2} />
<spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} decay={0} intensity={Math.PI} />
<pointLight position={[-10, -10, -10]} decay={0} intensity={Math.PI} />
<Suspense fallback={<Loader />}>
<Model position={[0, -1, 0]} scale={70} />
</Suspense>
</Canvas>
)
}
ReactDOM.render(
<App/>,
document.getElementById("root")
);
前に自分で作成した以下のサイトの記録を参考にして作成してみました
CodeSandboxでReact Three Fiber実験その3 glTF 3Dモデル表示 > React Three Fiber Practice21 glTF Model07
React Three Fiber 8.16.1 glTF Loader Test06
React Three Fiber 8.16.1 glTF Loader Test06
HTML Test01と同じです
CSS Test01と同じです
JS(JavaScript)
import ReactDOM from 'https://esm.sh/react-dom@18.2.0'
import React, { useRef, useState, Suspense } from 'https://esm.sh/react@18.2.0'
import { GLTFLoader } from 'https://esm.sh/three@0.163.0/examples/jsm/loaders/GLTFLoader'
import { Canvas, useFrame, useLoader } from 'https://esm.sh/@react-three/fiber@8.16.1'
import { Html, useProgress } from 'https://esm.sh/@react-three/drei@9.105.4'
const Loader = () => {
const { progress } = useProgress()
return (
<Html center>
{progress} % loaded
</Html>
)
}
const Model = (props) => {
const gltf = useLoader(
GLTFLoader,
'https://raw.githack.com/KhronosGroup/glTF-Sample-Models/master/2.0/Lantern/glTF-Binary/Lantern.glb'
)
useFrame((state) => {
//gltf.scene.rotation.x += 0.01
gltf.scene.rotation.x = state.mouse.y * 5
gltf.scene.rotation.y = state.mouse.x * 5
//gltf.scene.rotation.z = (state.mouse.x + state.mouse.y) / 2 * 5
}, [])
return (
<>
<primitive object={gltf.scene} position={props.position} scale={props.scale} />
</>
)
}
const App = () => {
return (
<Canvas>
<ambientLight intensity={Math.PI / 2} />
<spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} decay={0} intensity={Math.PI} />
<pointLight position={[-10, -10, -10]} decay={0} intensity={Math.PI} />
<Suspense fallback={<Loader />}>
<Model position={[0, -2, 0]} scale={0.18} />
</Suspense>
</Canvas>
)
}
ReactDOM.render(
<App/>,
document.getElementById("root")
);
前に自分で作成した以下のサイトの記録を参考にして作成してみました
CodeSandboxでReact Three Fiber実験その3 glTF 3Dモデル表示 > React Three Fiber Practice22 glTF Model08
React Three Fiber 8.16.1 glTF Loader Test07
React Three Fiber 8.16.1 glTF Loader Test07
HTML Test01と同じです
CSS Test01と同じです
JS(JavaScript)
import ReactDOM from 'https://esm.sh/react-dom@18.2.0'
import React, { useRef, useState, Suspense } from 'https://esm.sh/react@18.2.0'
import { GLTFLoader } from 'https://esm.sh/three@0.163.0/examples/jsm/loaders/GLTFLoader'
import { Canvas, useFrame, useLoader } from 'https://esm.sh/@react-three/fiber@8.16.1'
import { Html, useProgress } from 'https://esm.sh/@react-three/drei@9.105.4'
const Loader = () => {
const { progress } = useProgress()
return (
<Html center>
{progress} % loaded
</Html>
)
}
const Model = (props) => {
const gltf = useLoader(
GLTFLoader,
'https://raw.githack.com/KhronosGroup/glTF-Sample-Models/master/2.0/BoomBox/glTF-Binary/BoomBox.glb'
)
useFrame((state) => {
//gltf.scene.rotation.x += 0.01
gltf.scene.rotation.x = state.mouse.y * 5
gltf.scene.rotation.y = state.mouse.x * 5
//gltf.scene.rotation.z = (state.mouse.x + state.mouse.y) / 2 * 5
}, [])
return (
<>
<primitive object={gltf.scene} position={props.position} scale={props.scale} />
</>
)
}
const App = () => {
return (
<Canvas>
<ambientLight intensity={Math.PI / 2} />
<spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} decay={0} intensity={Math.PI} />
<pointLight position={[-10, -10, -10]} decay={0} intensity={Math.PI} />
<Suspense fallback={<Loader />}>
<Model position={[0, 1, 0]} scale={200} />
</Suspense>
</Canvas>
)
}
ReactDOM.render(
<App/>,
document.getElementById("root")
);
前に自分で作成した以下のサイトの記録を参考にして作成してみました
CodeSandboxでReact Three Fiber実験その3 glTF 3Dモデル表示 > React Three Fiber Practice23 glTF Model09
React Three Fiber 8.16.1 glTF Loader Test08
React Three Fiber 8.16.1 glTF Loader Test08
HTML Test01と同じです
CSS Test01と同じです
JS(JavaScript)
import ReactDOM from 'https://esm.sh/react-dom@18.2.0'
import React, { useRef, useState, Suspense } from 'https://esm.sh/react@18.2.0'
import { GLTFLoader } from 'https://esm.sh/three@0.163.0/examples/jsm/loaders/GLTFLoader'
import { Canvas, useFrame, useLoader } from 'https://esm.sh/@react-three/fiber@8.16.1'
import { Html, useProgress } from 'https://esm.sh/@react-three/drei@9.105.4'
const Loader = () => {
const { progress } = useProgress()
return (
<Html center>
{progress} % loaded
</Html>
)
}
const Model = (props) => {
const gltf = useLoader(
GLTFLoader,
'https://raw.githack.com/KhronosGroup/glTF-Sample-Models/master/2.0/Corset/glTF-Binary/Corset.glb'
)
useFrame((state) => {
//gltf.scene.rotation.x += 0.01
gltf.scene.rotation.x = state.mouse.y * 5
gltf.scene.rotation.y = state.mouse.x * 5
//gltf.scene.rotation.z = (state.mouse.x + state.mouse.y) / 2 * 5
}, [])
return (
<>
<primitive object={gltf.scene} position={props.position} scale={props.scale} />
</>
)
}
const App = () => {
return (
<Canvas>
<ambientLight intensity={Math.PI / 2} />
<spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} decay={0} intensity={Math.PI} />
<pointLight position={[-10, -10, -10]} decay={0} intensity={Math.PI} />
<Suspense fallback={<Loader />}>
<Model position={[0, -1, 0]} scale={70} />
</Suspense>
</Canvas>
)
}
ReactDOM.render(
<App/>,
document.getElementById("root")
);
前に自分で作成した以下のサイトの記録を参考にして作成してみました
CodeSandboxでReact Three Fiber実験その3 glTF 3Dモデル表示 > React Three Fiber Practice24 glTF Model10
React Three Fiber 8.16.1 glTF Loader Test09
React Three Fiber 8.16.1 glTF Loader Test09
HTML Test01と同じです
CSS Test01と同じです
JS(JavaScript)
import ReactDOM from 'https://esm.sh/react-dom@18.2.0'
import React, { useRef, useState, Suspense } from 'https://esm.sh/react@18.2.0'
import { GLTFLoader } from 'https://esm.sh/three@0.163.0/examples/jsm/loaders/GLTFLoader'
import { Canvas, useFrame, useLoader } from 'https://esm.sh/@react-three/fiber@8.16.1'
import { Html, useProgress } from 'https://esm.sh/@react-three/drei@9.105.4'
const Loader = () => {
const { progress } = useProgress()
return (
<Html center>
{progress} % loaded
</Html>
)
}
const Model = (props) => {
const gltf = useLoader(
GLTFLoader,
'https://rawcdn.githack.com/siouxcitizen/3DModel/a1c2e47550ca20de421f6d779229f66efab07830/yuusha.gltf'
//'https://cdn.jsdelivr.net/gh/siouxcitizen/3DModel@a1c2e47550ca20de421f6d779229f66efab07830/yuusha.gltf'
)
useFrame((state) => {
//gltf.scene.rotation.x += 0.01
gltf.scene.rotation.x = state.mouse.y * -1.5
gltf.scene.rotation.y = state.mouse.x * 5
//gltf.scene.rotation.z = (state.mouse.x + state.mouse.y) / 2 * 5
}, [])
return (
<>
<primitive object={gltf.scene} position={props.position} scale={props.scale} />
</>
)
}
const App = () => {
return (
<Canvas>
<ambientLight intensity={Math.PI / 2} />
<spotLight position={[10, 10, 10]} angle={0.15} penumbra={1} decay={0} intensity={Math.PI} />
<pointLight position={[-10, -10, -10]} decay={0} intensity={Math.PI} />
<Suspense fallback={<Loader />}>
<Model position={[0, -1, 0]} scale={1} />
</Suspense>
</Canvas>
)
}
ReactDOM.render(
<App/>,
document.getElementById("root")
);
前に自分で作成した以下のサイトやコードの記録を参考にして作成してみました
・CodeSandboxでReact Three Fiber実験その2 glTF 3Dモデル表示テスト
・Three.js .glTF 3D Model Display
・Three.js r102 .glTF 3D Model Display
次回
この記事が気に入ったらサポートをしてみませんか?