3d Visualizer

daffy0208/ai-dev-standards/skills/3d-visualizer

作者 daffy020832c3241e48f9無授權條款37 個星標收錄於 2026年10月8日更新於 2026年10月8日儲存庫9 個月前更新

Expert in Three.js, 3D graphics, and interactive 3D visualizations

AI 產生的概覽

指導使用 Three.js 與 React Three Fiber 建立 3D 場景、產品檢視器與 3D 資料視覺化。

功能
此技能提供使用 Three.js 與 React Three Fiber 建構 3D 圖形的參考指引與程式碼範例。內容涵蓋基礎場景、光照與材質、GLTF 模型載入、動畫、3D 長條圖、網路圖、互動式產品配置器,以及實例化網格的效能技巧。它產出可供開發者改寫進自己專案的 TypeScript/React 元件範例程式碼。
適用情境
適用於建構互動式 3D 網頁體驗,例如產品檢視器、配置器、3D 圖表、網路圖、科學視覺化或 3D 遊戲原型。也適合用來設定 Three.js 或 React Three Fiber 專案並最佳化 3D 算繪效能。
執行需求
需要一個 JavaScript/TypeScript 網頁專案,並安裝 three、@react-three/fiber 與 @react-three/drei 這些 npm 套件。此技能不附帶指令碼,僅包含說明與程式碼範例。

3D Visualizer Skill

I help you create 3D visualizations, interactive 3D graphics, and immersive web experiences using Three.js.

What I Do

3D Graphics:

  • 3D models and scenes
  • Materials and lighting
  • Animations and interactions
  • Camera controls

3D Data Visualization:

  • 3D charts and graphs
  • Network visualizations
  • Geospatial data
  • Scientific visualization

Interactive 3D:

  • Product viewers (360°)
  • Configurators
  • Interactive demos
  • 3D games

Three.js with React Three Fiber

bash
npm install three @react-three/fiber @react-three/drei

Basic 3D Scene

typescript
// components/Scene3D.tsx'use client'import { Canvas } from '@react-three/fiber'import { OrbitControls, Box, Sphere } from '@react-three/drei'
export function Scene3D() {  return (    <Canvas camera={{ position: [5, 5, 5], fov: 50 }}>      {/* Lighting */}      <ambientLight intensity={0.5} />      <pointLight position={[10, 10, 10]} />
      {/* 3D Objects */}      <Box position={[-2, 0, 0]} args={[1, 1, 1]}>        <meshStandardMaterial color="hotpink" />      </Box>
      <Sphere position={[2, 0, 0]} args={[0.7, 32, 32]}>        <meshStandardMaterial color="cyan" metalness={0.8} roughness={0.2} />      </Sphere>
      {/* Camera Controls */}      <OrbitControls />    </Canvas>  )}

3D Model Loader

typescript
'use client'import { useGLTF } from '@react-three/drei'import { Canvas } from '@react-three/fiber'
function Model() {  const { scene } = useGLTF('/models/product.glb')  return <primitive object={scene} />}
export function ProductViewer() {  return (    <Canvas>      <ambientLight intensity={0.5} />      <spotLight position={[10, 10, 10]} angle={0.15} />
      <Model />
      <OrbitControls        enableZoom={true}        enablePan={false}        minPolarAngle={Math.PI / 4}        maxPolarAngle={Math.PI / 2}      />    </Canvas>  )}

Animated 3D

typescript
'use client'import { useRef } from 'react'import { useFrame } from '@react-three/fiber'import { Mesh } from 'three'
function RotatingCube() {  const meshRef = useRef<Mesh>(null)
  useFrame((state, delta) => {    if (meshRef.current) {      meshRef.current.rotation.x += delta      meshRef.current.rotation.y += delta * 0.5    }  })
  return (    <mesh ref={meshRef}>      <boxGeometry args={[2, 2, 2]} />      <meshStandardMaterial color="orange" />    </mesh>  )}
export function AnimatedScene() {  return (    <Canvas>      <ambientLight />      <pointLight position={[10, 10, 10]} />      <RotatingCube />    </Canvas>  )}

3D Chart (Bar Chart)

typescript
'use client'import { Canvas } from '@react-three/fiber'import { OrbitControls, Text } from '@react-three/drei'
interface DataPoint {  label: string  value: number  color: string}
function Bar3D({ position, height, color, label }: {  position: [number, number, number]  height: number  color: string  label: string}) {  return (    <group position={position}>      <mesh position={[0, height / 2, 0]}>        <boxGeometry args={[0.8, height, 0.8]} />        <meshStandardMaterial color={color} />      </mesh>
      <Text        position={[0, -0.5, 0]}        fontSize={0.3}        color="black"      >        {label}      </Text>    </group>  )}
export function BarChart3D({ data }: { data: DataPoint[] }) {  return (    <Canvas camera={{ position: [5, 5, 8] }}>      <ambientLight intensity={0.5} />      <pointLight position={[10, 10, 10]} />
      {data.map((item, i) => (        <Bar3D          key={i}          position={[i * 1.5 - (data.length * 1.5) / 2, 0, 0]}          height={item.value}          color={item.color}          label={item.label}        />      ))}
      <OrbitControls />    </Canvas>  )}
// Usageconst salesData = [  { label: 'Jan', value: 4, color: '#3b82f6' },  { label: 'Feb', value: 3, color: '#3b82f6' },  { label: 'Mar', value: 6, color: '#3b82f6' },  { label: 'Apr', value: 8, color: '#3b82f6' }]
<BarChart3D data={salesData} />

Interactive 3D Product Configurator

typescript
'use client'import { useState } from 'react'import { Canvas } from '@react-three/fiber'import { OrbitControls } from '@react-three/drei'
const colors = {  red: '#ef4444',  blue: '#3b82f6',  green: '#10b981',  yellow: '#f59e0b'}
function Product({ color }: { color: string }) {  return (    <mesh>      <boxGeometry args={[2, 2, 2]} />      <meshStandardMaterial color={color} metalness={0.5} roughness={0.3} />    </mesh>  )}
export function ProductConfigurator() {  const [selectedColor, setSelectedColor] = useState('blue')
  return (    <div className="flex gap-4">      <div className="w-2/3">        <Canvas camera={{ position: [3, 3, 3] }}>          <ambientLight intensity={0.5} />          <spotLight position={[10, 10, 10]} />
          <Product color={colors[selectedColor]} />
          <OrbitControls />        </Canvas>      </div>
      <div className="w-1/3">        <h3 className="font-bold mb-4">Choose Color</h3>        <div className="grid grid-cols-2 gap-2">          {Object.entries(colors).map(([name, hex]) => (            <button              key={name}              onClick={() => setSelectedColor(name)}              className={`p-4 rounded border-2 ${                selectedColor === name ? 'border-black' : 'border-gray-300'              }`}              style={{ backgroundColor: hex }}            >              {name}            </button>          ))}        </div>      </div>    </div>  )}

Network Graph 3D

typescript
'use client'import { Canvas } from '@react-three/fiber'import { Line } from '@react-three/drei'
interface Node {  id: string  position: [number, number, number]}
interface Edge {  from: string  to: string}
function NetworkGraph({ nodes, edges }: {  nodes: Node[]  edges: Edge[]}) {  const nodeMap = new Map(nodes.map(n => [n.id, n]))
  return (    <>      {/* Nodes */}      {nodes.map((node) => (        <mesh key={node.id} position={node.position}>          <sphereGeometry args={[0.2]} />          <meshStandardMaterial color="cyan" />        </mesh>      ))}
      {/* Edges */}      {edges.map((edge, i) => {        const from = nodeMap.get(edge.from)        const to = nodeMap.get(edge.to)        if (!from || !to) return null
        return (          <Line            key={i}            points={[from.position, to.position]}            color="white"            lineWidth={1}          />        )      })}    </>  )}
export function Network3DVisualization() {  const nodes = [    { id: 'A', position: [0, 0, 0] },    { id: 'B', position: [2, 1, 0] },    { id: 'C', position: [-2, 1, 0] },    { id: 'D', position: [0, 2, 1] }  ]
  const edges = [    { from: 'A', to: 'B' },    { from: 'A', to: 'C' },    { from: 'B', to: 'D' },    { from: 'C', to: 'D' }  ]
  return (    <Canvas camera={{ position: [0, 0, 8] }}>      <ambientLight />      <pointLight position={[10, 10, 10]} />
      <NetworkGraph nodes={nodes} edges={edges} />
      <OrbitControls />    </Canvas>  )}

Performance Tips

Instanced Mesh (Many Objects)

typescript
'use client'import { useRef, useMemo } from 'react'import { useFrame } from '@react-three/fiber'import * as THREE from 'three'
export function Particles({ count = 1000 }: { count?: number }) {  const meshRef = useRef<THREE.InstancedMesh>(null)
  const particles = useMemo(() => {    const temp = []    for (let i = 0; i < count; i++) {      const t = Math.random() * 100      const factor = 20 + Math.random() * 100      const speed = 0.01 + Math.random() / 200      temp.push({ t, factor, speed, mx: 0, my: 0 })    }    return temp  }, [count])
  useFrame((state) => {    if (meshRef.current) {      particles.forEach((particle, i) => {        let { t, factor, speed, mx, my } = particle
        t = particle.t += speed        const a = Math.cos(t) + Math.sin(t * 1) / 10        const b = Math.sin(t) + Math.cos(t * 2) / 10        const s = Math.cos(t)
        const dummy = new THREE.Object3D()        dummy.position.set(          (mx / 10) * a + Math.cos((t / 10) * factor) + (Math.sin(t * 1) * factor) / 10,          (my / 10) * b + Math.sin((t / 10) * factor) + (Math.cos(t * 2) * factor) / 10,          (my / 10) * b + Math.cos((t / 10) * factor) + (Math.sin(t * 3) * factor) / 10        )        dummy.scale.set(s, s, s)        dummy.updateMatrix()        meshRef.current!.setMatrixAt(i, dummy.matrix)      })      meshRef.current.instanceMatrix.needsUpdate = true    }  })
  return (    <instancedMesh ref={meshRef} args={[undefined, undefined, count]}>      <sphereGeometry args={[0.05, 16, 16]} />      <meshPhongMaterial color="cyan" />    </instancedMesh>  )}

When to Use Me

Perfect for:

  • Building 3D product viewers
  • Creating data visualizations
  • Interactive 3D experiences
  • Scientific visualization
  • 3D game prototypes

I'll help you:

  • Set up Three.js projects
  • Load 3D models
  • Create interactive 3D
  • Optimize 3D performance
  • Build 3D charts

What I'll Create

🎨 3D Scenes📦 Product Viewers📊 3D Charts🌐 Network Graphs🎮 Interactive 3D⚡ Performance-Optimized 3D

Let's bring your data and products to life in 3D!

來源與署名

來源:daffy0208/ai-dev-standards位於skills/3d-visualizer提交32c3241

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架