From 7d17ee18729a8db7127afd3be370d1ae05a5ef73 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 11 Jan 2026 11:15:43 +0800 Subject: [PATCH] =?UTF-8?q?style:=20=E6=B7=B1=E5=BA=A6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=203D=20=E6=8E=A7=E5=88=B6=E5=99=A8=20UI=EF=BC=8C=E9=80=82?= =?UTF-8?q?=E9=85=8D=20Shadcn=20=E9=A3=8E=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/qwen-camera-widget.tsx | 330 +++++++++++------------------- 1 file changed, 119 insertions(+), 211 deletions(-) diff --git a/components/qwen-camera-widget.tsx b/components/qwen-camera-widget.tsx index da878ea76..cfe2e02af 100644 --- a/components/qwen-camera-widget.tsx +++ b/components/qwen-camera-widget.tsx @@ -2,6 +2,17 @@ import { useEffect, useRef, useCallback, useState } from "react"; import * as THREE from "three"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { Button } from "@/components/ui/button"; +import { Badge } from "@/components/ui/badge"; +import { RotateCcw } from "lucide-react"; +import { cn } from "@/lib/utils"; // 相机状态接口 export interface CameraState { @@ -162,7 +173,8 @@ export function QwenCameraWidget({ // 场景 const scene = new THREE.Scene(); - scene.background = new THREE.Color(0x0a0a0f); + // 移除背景色,使用透明背景 + // scene.background = new THREE.Color(0x0a0a0f); sceneRef.current = scene; // 相机 @@ -175,7 +187,7 @@ export function QwenCameraWidget({ const renderer = new THREE.WebGLRenderer({ canvas: canvasRef.current, antialias: true, - alpha: true, + alpha: true, // 启用透明 }); renderer.setSize(width, height); renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)); @@ -183,25 +195,28 @@ export function QwenCameraWidget({ rendererRef.current = renderer; // 光照 - const ambientLight = new THREE.AmbientLight(0xffffff, 0.4); + const ambientLight = new THREE.AmbientLight(0xffffff, 0.6); scene.add(ambientLight); - const mainLight = new THREE.DirectionalLight(0xffffff, 0.8); + const mainLight = new THREE.DirectionalLight(0xffffff, 1.0); mainLight.position.set(5, 10, 5); scene.add(mainLight); - const fillLight = new THREE.DirectionalLight(0xE93D82, 0.3); + const fillLight = new THREE.DirectionalLight(0xE93D82, 0.4); fillLight.position.set(-5, 5, -5); scene.add(fillLight); - // 网格 - const gridHelper = new THREE.GridHelper(5, 20, 0x1a1a2e, 0x12121a); + // 网格 - 调整颜色以适应浅色/深色主题 + // 使用更中性的颜色 + const gridHelper = new THREE.GridHelper(5, 20, 0x888888, 0x444444); gridHelper.position.y = -0.01; + (gridHelper.material as THREE.Material).transparent = true; + (gridHelper.material as THREE.Material).opacity = 0.2; scene.add(gridHelper); // 创建图片卡片 const cardGeo = new THREE.BoxGeometry(1.2, 1.2, 0.02); - const cardMat = new THREE.MeshBasicMaterial({ color: 0x3a3a4a }); + const cardMat = new THREE.MeshBasicMaterial({ color: 0xcccccc }); const imageCard = new THREE.Mesh(cardGeo, cardMat); imageCard.position.copy(CENTER); scene.add(imageCard); @@ -459,25 +474,28 @@ export function QwenCameraWidget({ }, []); // 下拉选择器变化处理 - const handleAzimuthChange = useCallback((value: number) => { + const handleAzimuthChange = useCallback((value: string) => { + const val = Number(value); setState(prev => { - const newState = { ...prev, azimuth: value }; + const newState = { ...prev, azimuth: val }; onStateChange?.(newState); return newState; }); }, [onStateChange]); - const handleElevationChange = useCallback((value: number) => { + const handleElevationChange = useCallback((value: string) => { + const val = Number(value); setState(prev => { - const newState = { ...prev, elevation: value }; + const newState = { ...prev, elevation: val }; onStateChange?.(newState); return newState; }); }, [onStateChange]); - const handleDistanceChange = useCallback((value: number) => { + const handleDistanceChange = useCallback((value: string) => { + const val = Number(value); setState(prev => { - const newState = { ...prev, distance: value }; + const newState = { ...prev, distance: val }; onStateChange?.(newState); return newState; }); @@ -505,7 +523,7 @@ export function QwenCameraWidget({ closest = opt.value; } } - return closest; + return closest.toString(); }; const findClosestElevation = (value: number) => { @@ -518,21 +536,22 @@ export function QwenCameraWidget({ closest = opt.value; } } - return closest; + return closest.toString(); }; const findClosestDistance = (value: number) => { - if (value < 3) return 1; - if (value < 7) return 5; - return 8; + if (value < 3) return "1"; + if (value < 7) return "5"; + return "8"; }; return ( -
+
{/* 3D 画布 */} -
+
-
- - {/* 提示词显示 */} -
- {generatePrompt(state)} -
- - {/* 下拉选择器 */} -
-
- 水平 - -
-
- 垂直 - -
-
- 距离 - + + {/* 提示词浮层 */} +
+ {generatePrompt(state)}
- {/* 数值显示和重置 */} -
-
- 水平角度 - {Math.round(state.azimuth)}° + {/* 控制面板 */} +
+
+
+ + +
+ + {Math.round(state.azimuth)}° + +
+
+ +
+ + +
+ + {Math.round(state.elevation)}° + +
+
+ +
+ + +
+ + {state.distance.toFixed(1)} + +
+
-
- 垂直角度 - {Math.round(state.elevation)}° -
-
- 距离 - {state.distance.toFixed(1)} -
- + +
- - {/* 内联样式 */} -
); } export default QwenCameraWidget; -