fix: align 3d world mesh display
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled

This commit is contained in:
Your Name 2026-05-20 18:20:54 +08:00
parent 68eab912d8
commit 4d83a2d001
3 changed files with 15 additions and 3 deletions

View File

@ -56,6 +56,7 @@ type Model3DViewerProps = {
previewImageUrl?: string | null; previewImageUrl?: string | null;
emptyStateTitle?: string; emptyStateTitle?: string;
settings: Model3DViewerSettings; settings: Model3DViewerSettings;
modelRotation?: [number, number, number];
layerVisibility?: Record<string, boolean>; layerVisibility?: Record<string, boolean>;
onLayersChange?: (layers: Model3DLayer[]) => void; onLayersChange?: (layers: Model3DLayer[]) => void;
onStatsChange?: (stats: Model3DStats) => void; onStatsChange?: (stats: Model3DStats) => void;
@ -194,12 +195,14 @@ function collectSceneMeta(scene: Object3D): {
function ModelScene({ function ModelScene({
url, url,
settings, settings,
modelRotation,
layerVisibility, layerVisibility,
onLayersChange, onLayersChange,
onStatsChange, onStatsChange,
}: { }: {
url: string; url: string;
settings: Model3DViewerSettings; settings: Model3DViewerSettings;
modelRotation?: [number, number, number];
layerVisibility?: Record<string, boolean>; layerVisibility?: Record<string, boolean>;
onLayersChange?: (layers: Model3DLayer[]) => void; onLayersChange?: (layers: Model3DLayer[]) => void;
onStatsChange?: (stats: Model3DStats) => void; onStatsChange?: (stats: Model3DStats) => void;
@ -266,7 +269,11 @@ function ModelScene({
} }
}, [meta.meshRefs, settings.wireframe]); }, [meta.meshRefs, settings.wireframe]);
return <primitive object={scene} scale={1} />; return (
<group rotation={modelRotation || [0, 0, 0]}>
<primitive object={scene} scale={1} />
</group>
);
} }
function ViewerCaptureBridge({ function ViewerCaptureBridge({
@ -351,6 +358,7 @@ export function Model3DViewer({
previewImageUrl, previewImageUrl,
emptyStateTitle = "准备生成 3D 资产", emptyStateTitle = "准备生成 3D 资产",
settings, settings,
modelRotation,
layerVisibility, layerVisibility,
onLayersChange, onLayersChange,
onStatsChange, onStatsChange,
@ -458,6 +466,7 @@ export function Model3DViewer({
<group position={[0, 0, 0]}> <group position={[0, 0, 0]}>
<ModelScene <ModelScene
layerVisibility={layerVisibility} layerVisibility={layerVisibility}
modelRotation={modelRotation}
onLayersChange={onLayersChange} onLayersChange={onLayersChange}
onStatsChange={onStatsChange} onStatsChange={onStatsChange}
settings={settings} settings={settings}

View File

@ -876,8 +876,10 @@ export function World3DNode({
return ( return (
<div <div
className={cn( className={cn(
"relative h-full w-full overflow-hidden rounded-xl border bg-card shadow-sm", "relative h-full w-full overflow-hidden rounded-none border border-[#dbe2ee] bg-white shadow-[0_0_0_1px_rgba(219,226,238,0.34),0_16px_34px_rgba(22,24,29,0.08)] transition-all dark:border-zinc-800 dark:bg-zinc-950",
isSelected && "border-primary" isSelected
? "border-[#5b76fe] ring-2 ring-[#5b76fe]/14 shadow-[0_0_0_1px_rgba(91,118,254,0.14),0_20px_38px_rgba(91,118,254,0.12)]"
: "hover:border-[#cfd9ea]"
)} )}
onMouseEnter={() => setIsHovered(true)} onMouseEnter={() => setIsHovered(true)}
onMouseLeave={() => setIsHovered(false)} onMouseLeave={() => setIsHovered(false)}

View File

@ -1540,6 +1540,7 @@ export function World3DViewer({
<Model3DViewer <Model3DViewer
emptyStateTitle={emptyStateTitle} emptyStateTitle={emptyStateTitle}
layerVisibility={meshLayerVisibility} layerVisibility={meshLayerVisibility}
modelRotation={[Math.PI, 0, 0]}
modelUrl={meshUrl} modelUrl={meshUrl}
onLayersChange={onMeshLayersChange} onLayersChange={onMeshLayersChange}
onStatsChange={onMeshStatsChange} onStatsChange={onMeshStatsChange}