From a4e8e3192166fe5f1acfa871fdb9d8b260f3ea32 Mon Sep 17 00:00:00 2001 From: hypercross Date: Sun, 15 Mar 2026 19:24:40 +0800 Subject: [PATCH] fix: render issues --- src/components/md-token-viewer.tsx | 24 ++++++++++++------------ src/components/md-token.tsx | 3 ++- src/components/utils/stl-generator.ts | 1 + 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/components/md-token-viewer.tsx b/src/components/md-token-viewer.tsx index 2b16ac7..5a06d47 100644 --- a/src/components/md-token-viewer.tsx +++ b/src/components/md-token-viewer.tsx @@ -1,19 +1,17 @@ -import { customElement, noShadowDOM } from "solid-element"; import { createSignal, onMount, onCleanup, - Show, + Show, createEffect, } from "solid-js"; import * as THREE from "three"; import { STLLoader } from "three/examples/jsm/loaders/STLLoader.js"; export interface TokenViewerProps { - stlUrl: string; + stlUrl: string | null; } -customElement("md-token-viewer", {}, (props, { element }) => { - noShadowDOM(); +export default function MdTokenViewer(props: TokenViewerProps) { const [viewerRef, setViewerRef] = createSignal(null); const [isLoaded, setIsLoaded] = createSignal(false); @@ -60,6 +58,7 @@ customElement("md-token-viewer", {}, (props, { element }) => { }); mesh = new THREE.Mesh(geometry, material); + mesh.rotateX(Math.PI); scene?.add(mesh); // 调整相机 @@ -82,6 +81,7 @@ customElement("md-token-viewer", {}, (props, { element }) => { // 初始化 Three.js 场景 onMount(() => { const viewerEl = viewerRef(); + console.log("Viewer element:", viewerEl); if (!viewerEl) return; // 创建场景 @@ -164,12 +164,6 @@ customElement("md-token-viewer", {}, (props, { element }) => { }; animate(); - // 加载 STL 模型 - const stlUrl = element.getAttribute("stl-url"); - if (stlUrl) { - loadSTL(stlUrl); - } - // 清理函数 onCleanup(() => { if (animationId) cancelAnimationFrame(animationId); @@ -185,6 +179,12 @@ customElement("md-token-viewer", {}, (props, { element }) => { if (scene) scene.clear(); }); }); + + createEffect(() => { + if (props.stlUrl) { + loadSTL(props.stlUrl); + } + }); return (
{
); -}); +} diff --git a/src/components/md-token.tsx b/src/components/md-token.tsx index d06fef5..4d396b8 100644 --- a/src/components/md-token.tsx +++ b/src/components/md-token.tsx @@ -10,6 +10,7 @@ import { import { resolvePath } from "./utils/path"; import { traceImage, type TracedLayer } from "./utils/image-tracer"; import { generateSTL, type ExtrusionSettings } from "./utils/stl-generator"; +import MdTokenViewer from "./md-token-viewer"; export interface TokenProps { size?: number; // 模型整体尺寸 (mm), 默认 50 @@ -182,7 +183,7 @@ customElement("md-token", { size: 50, defaultThickness: 2 }, (props, { element }

3D 模型预览

- + diff --git a/src/components/utils/stl-generator.ts b/src/components/utils/stl-generator.ts index 89f944e..bafb599 100644 --- a/src/components/utils/stl-generator.ts +++ b/src/components/utils/stl-generator.ts @@ -63,6 +63,7 @@ export async function generateSTL( // 创建挤压几何体 const extrudeSettings: THREE.ExtrudeGeometryOptions = { depth: layerSetting.thickness, + curveSegments: 36, bevelEnabled: false, };