gpt4 book ai didi

javascript - 如何在 Matter.js 中使用 SVG 图像?

转载 作者:行者123 更新时间:2023-12-05 01:32:51 26 4
gpt4 key购买 nike

我正在尝试做的事情:使用 Font Awesome SVG - sleigh - 在 matter.js 中。

我已经试过了:

Matter.Bodies.fromVertices(500, 50 , Matter.Svg.pathToVertices("sleigh.svg"))

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M612.7 350.7l-9.3-7.4c-6.9-5.5-17-4.4-22.5 2.5l-10 12.5c-5.5 6.9-4.4 17 2.5 22.5l9.3 7.4c5.9 4.7 9.2 11.7 9.2 19.2 0 13.6-11 24.6-24.6 24.6H48c-8.8 0-16 7.2-16 16v16c0 8.8 7.2 16 16 16h516c39 0 73.7-29.3 75.9-68.3 1.4-23.8-8.7-46.3-27.2-61zM32 224c0 59.6 40.9 109.2 96 123.5V400h64v-48h192v48h64v-48c53 0 96-43 96-96v-96c17.7 0 32-14.3 32-32s-14.3-32-32-32h-96v64c0 35.3-28.7 64-64 64h-20.7c-65.8 0-125.9-37.2-155.3-96-29.4-58.8-89.6-96-155.3-96H32C14.3 32 0 46.3 0 64s14.3 32 32 32v128z"/></svg>

但是得到了:

matter.js:4624 matter-js: Svg.pathToVertices: SVGPathSeg not defined, a polyfill is required.

matter.js:7554 Uncaught TypeError: Cannot read property 'numberOfItems' of undefined

我做错了什么?

(P.S:我是 matter.js 的新手,如果这是一个愚蠢的问题,我很抱歉……)

最佳答案

让这个工作可能有点小题大做,因为,作为 the docs point out , polyfill SVGPathSeg 需要几个外部脚本和decompose a 2D polygon into convex pieces .随之而来的是版本问题。

引用 the official example 后对我有用的版本和 this outdated Codepen example如下片段所示。

值得注意的是,Matter.Bodies.fromVertices docs状态:“如果顶点是凹的,如果 poly-decomp.js 可用,它们将被分解。请注意,此过程不能保证支持复杂的顶点集(例如,那些有孔的顶点可能会失败)”这可能是您额外一行的原因在渲染的 body 中看到。

此外,MJS 的内置渲染器主要用于原型(prototype)设计目的,因此如果您要为页面上的原始 SVG 元素设置动画,则主体上有一条额外的线这一事实可能无关紧要。您也可以尝试高级字体 - 真棒填充雪橇,但我无法访问它们。

const engine = Matter.Engine.create();
const render = Matter.Render.create({
element: document.body,
engine: engine
});
const bodies = [
Matter.Bodies.rectangle(400, 210, 810, 60, {isStatic: true}),
...[...document.querySelectorAll("svg > path")].map(path => {
const body = Matter.Bodies.fromVertices(
100, 80, Matter.Svg.pathToVertices(path), {}, true
);
Matter.Body.scale(body, 0.2, 0.2);
return body;
})
];
Matter.Composite.add(engine.world, bodies);
Matter.Runner.run(engine);
Matter.Render.run(render);
svg {display: none;}
<script src="https://cdn.jsdelivr.net/npm/pathseg@1.2.1/pathseg.js"></script>
<script src="https://cdn.jsdelivr.net/npm/poly-decomp@0.3.0/build/decomp.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/matter-js/0.18.0/matter.js"></script>
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="sleigh" class="svg-inline--fa fa-sleigh fa-w-20" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path fill="currentColor" d="M612.7 350.7l-9.3-7.4c-6.9-5.5-17-4.4-22.5 2.5l-10 12.5c-5.5 6.9-4.4 17 2.5 22.5l9.3 7.4c5.9 4.7 9.2 11.7 9.2 19.2 0 13.6-11 24.6-24.6 24.6H48c-8.8 0-16 7.2-16 16v16c0 8.8 7.2 16 16 16h516c39 0 73.7-29.3 75.9-68.3 1.4-23.8-8.7-46.3-27.2-61zM32 224c0 59.6 40.9 109.2 96 123.5V400h64v-48h192v48h64v-48c53 0 96-43 96-96v-96c17.7 0 32-14.3 32-32s-14.3-32-32-32h-96v64c0 35.3-28.7 64-64 64h-20.7c-65.8 0-125.9-37.2-155.3-96-29.4-58.8-89.6-96-155.3-96H32C14.3 32 0 46.3 0 64s14.3 32 32 32v128z"></path></svg>

要重现您的错误,请注释掉

<script src="https://cdn.jsdelivr.net/npm/pathseg@1.2.1/pathseg.js"></script>

关于javascript - 如何在 Matter.js 中使用 SVG 图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65253422/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com