fix: render issues
This commit is contained in:
parent
e92065d14c
commit
a4e8e31921
|
|
@ -1,19 +1,17 @@
|
||||||
import { customElement, noShadowDOM } from "solid-element";
|
|
||||||
import {
|
import {
|
||||||
createSignal,
|
createSignal,
|
||||||
onMount,
|
onMount,
|
||||||
onCleanup,
|
onCleanup,
|
||||||
Show,
|
Show, createEffect,
|
||||||
} from "solid-js";
|
} from "solid-js";
|
||||||
import * as THREE from "three";
|
import * as THREE from "three";
|
||||||
import { STLLoader } from "three/examples/jsm/loaders/STLLoader.js";
|
import { STLLoader } from "three/examples/jsm/loaders/STLLoader.js";
|
||||||
|
|
||||||
export interface TokenViewerProps {
|
export interface TokenViewerProps {
|
||||||
stlUrl: string;
|
stlUrl: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
customElement("md-token-viewer", {}, (props, { element }) => {
|
export default function MdTokenViewer(props: TokenViewerProps) {
|
||||||
noShadowDOM();
|
|
||||||
|
|
||||||
const [viewerRef, setViewerRef] = createSignal<HTMLDivElement | null>(null);
|
const [viewerRef, setViewerRef] = createSignal<HTMLDivElement | null>(null);
|
||||||
const [isLoaded, setIsLoaded] = createSignal(false);
|
const [isLoaded, setIsLoaded] = createSignal(false);
|
||||||
|
|
@ -60,6 +58,7 @@ customElement("md-token-viewer", {}, (props, { element }) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
mesh = new THREE.Mesh(geometry, material);
|
mesh = new THREE.Mesh(geometry, material);
|
||||||
|
mesh.rotateX(Math.PI);
|
||||||
scene?.add(mesh);
|
scene?.add(mesh);
|
||||||
|
|
||||||
// 调整相机
|
// 调整相机
|
||||||
|
|
@ -82,6 +81,7 @@ customElement("md-token-viewer", {}, (props, { element }) => {
|
||||||
// 初始化 Three.js 场景
|
// 初始化 Three.js 场景
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
const viewerEl = viewerRef();
|
const viewerEl = viewerRef();
|
||||||
|
console.log("Viewer element:", viewerEl);
|
||||||
if (!viewerEl) return;
|
if (!viewerEl) return;
|
||||||
|
|
||||||
// 创建场景
|
// 创建场景
|
||||||
|
|
@ -164,12 +164,6 @@ customElement("md-token-viewer", {}, (props, { element }) => {
|
||||||
};
|
};
|
||||||
animate();
|
animate();
|
||||||
|
|
||||||
// 加载 STL 模型
|
|
||||||
const stlUrl = element.getAttribute("stl-url");
|
|
||||||
if (stlUrl) {
|
|
||||||
loadSTL(stlUrl);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 清理函数
|
// 清理函数
|
||||||
onCleanup(() => {
|
onCleanup(() => {
|
||||||
if (animationId) cancelAnimationFrame(animationId);
|
if (animationId) cancelAnimationFrame(animationId);
|
||||||
|
|
@ -185,6 +179,12 @@ customElement("md-token-viewer", {}, (props, { element }) => {
|
||||||
if (scene) scene.clear();
|
if (scene) scene.clear();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
createEffect(() => {
|
||||||
|
if (props.stlUrl) {
|
||||||
|
loadSTL(props.stlUrl);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
|
|
@ -208,4 +208,4 @@ customElement("md-token-viewer", {}, (props, { element }) => {
|
||||||
</Show>
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
});
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import {
|
||||||
import { resolvePath } from "./utils/path";
|
import { resolvePath } from "./utils/path";
|
||||||
import { traceImage, type TracedLayer } from "./utils/image-tracer";
|
import { traceImage, type TracedLayer } from "./utils/image-tracer";
|
||||||
import { generateSTL, type ExtrusionSettings } from "./utils/stl-generator";
|
import { generateSTL, type ExtrusionSettings } from "./utils/stl-generator";
|
||||||
|
import MdTokenViewer from "./md-token-viewer";
|
||||||
|
|
||||||
export interface TokenProps {
|
export interface TokenProps {
|
||||||
size?: number; // 模型整体尺寸 (mm), 默认 50
|
size?: number; // 模型整体尺寸 (mm), 默认 50
|
||||||
|
|
@ -182,7 +183,7 @@ customElement("md-token", { size: 50, defaultThickness: 2 }, (props, { element }
|
||||||
<h4 class="text-sm font-semibold mb-2 text-gray-700">
|
<h4 class="text-sm font-semibold mb-2 text-gray-700">
|
||||||
3D 模型预览
|
3D 模型预览
|
||||||
</h4>
|
</h4>
|
||||||
<md-token-viewer stl-url={stlUrl()!} />
|
<MdTokenViewer stlUrl={stlUrl()}/>
|
||||||
</div>
|
</div>
|
||||||
</Show>
|
</Show>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@ export async function generateSTL(
|
||||||
// 创建挤压几何体
|
// 创建挤压几何体
|
||||||
const extrudeSettings: THREE.ExtrudeGeometryOptions = {
|
const extrudeSettings: THREE.ExtrudeGeometryOptions = {
|
||||||
depth: layerSetting.thickness,
|
depth: layerSetting.thickness,
|
||||||
|
curveSegments: 36,
|
||||||
bevelEnabled: false,
|
bevelEnabled: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue