如何同步三.js和 HTML/SVG 坐标系(尤其是 y 轴)
How to synchronize the Three.js and HTML/SVG coordinate systems (especially w.r.t. the y-axis)?
我将3D内容与Three.js HTML和SVG内容相结合。Three.js CSSLoader 在同步 HTML 和 SVG 内容在 3D 世界中的位置方面做得很好。
但是SVG/HTML坐标系是"左撇子"的,而三.js坐标系是"右撇子"。这基本上意味着它们的 y 轴是相反的。在 SVG/HTML 中,y
/top
随着屏幕向下移动而上升,而 Three.js 使用更标准的数学约定,即当您向下进入屏幕时y
下降。
我必须不断地从一个转换到另一个,这很容易出错。我知道我不是第一个遇到这种情况的人(例如,看这里(。有人想出了一个通用的解决方案吗?这是我尝试过的:
-
用
.scale.y = -1
在Object3D
做所有事情。正如您可能怀疑的那样,这被证明是一场灾难。它把所有东西都翻过来了,甚至不要试图把你的相机放在那里。 -
与
.rotate.x = Math.PI
一起在Object3D
中做所有事情。这是更有希望的,但z
轴不再与 z 索引的 HTML 概念一致。不过,这就是我现在正在使用的。 -
在HTML中,不要使用
top
,使用bottom
。在 SVG 中,在<g transform="translate(0, imageHeight)">
内执行<g transform="scale(1, -1)">
内的所有操作。但是,我觉得这会让开发人员更加困惑,并且imageHeight
必须始终保持最新状态,这是另一个负担。
有没有人想出更好的东西?也许有一个图书馆可以帮助解决这个问题?
我建议您使用 SVG 全局转换属性,如果您发布代码示例,我可以编辑答案并在此处发布示例,也许是 JSfiddle。
基本上你需要将变换添加到你的SVG中,在你的情况下,要改变y轴的方向,你可以做一个"scale(1,-1("。
请参阅以下链接中的示例的 W3 文档:http://www.w3.org/TR/SVG/coords.html#SVGGlobalTransformAttribute
此属性的第一个常见用法:
大多数预测的CRS具有由正表示的北方方向 第二个轴的值,相反,SVG 具有 y 向下坐标 系统。这就是为什么,为了遵循通常的方式来表示 地图顶部为北方,推荐用于那种 ProjectedCRS 使用具有 "scale(1, -1("值,如下面的第三个示例所示。
他们在那里也有一些例子,我希望它能解决你的问题。 :)
- D3在一个调用中绘制不同的SVG形状,没有可见性
- 如何使用javascript从主svg对象动态创建svg视图框
- 如何更改<svg>标记为<img>用js标记
- 锚点元素不't使用svg时,请打开EDGE上的href
- 带有填充属性的SVG矩形显示在包含元素的上方插入框阴影
- 使用onclick绘制SVG路径
- SVG/JavaScript:尝试选择和更改多边形点
- 顺时针旋转Svg元件
- 禁用SVG拖动
- 在select元素中显示highchart dashstyle(svg)
- 在D3.js中,有没有任何方法可以将x和y方向上的滚动事件绑定到平移svg
- 缩放Raphael/SVG容器以适应所有内容
- JavaScript-动态SVG-onload属性-未触发事件
- 设置动画时,SVG/Raphael大圆圈会变形
- 使用SVG和JavaScript创建波浪动画
- Canvas+svg路径动画,在路径中的特定点暂停一段时间,然后继续
- D3.js生成有效的SVG,但不显示任何内容
- SVG xml to image
- 如何同步三.js和 HTML/SVG 坐标系(尤其是 y 轴)
- 矩阵变换:将SVG路径坐标转换为传单坐标系