我将3D内容与Three.js与HTML和SVG内容相结合。 Three.js CSSLoader在3D世界中同步放置HTML和SVG内容的功能非常出色。如何同步Three.js和HTML/SVG坐标系(尤其是y轴)?
但SVG/HTML坐标系是'左撇子',而Three.js坐标系是'右撇子'。这基本上意味着他们的y轴是相反的。在SVG/HTML中,当你沿着屏幕前进时,y
/top
会上升,Three.js使用更为标准的数学公约y
。
我必须不断地从一个转换到另一个,这很容易出错。我知道我不是第一个遇到这个问题的人(例如,look here)。有人提出了一个通用的解决方案?下面是我的尝试:
不要在
Object3D
与.scale.y = -1
一切。正如你可能会怀疑的那样,这真是一场灾难。它将所有内容都转化为内容,甚至不会尝试将相机放在那里。尽一切在
Object3D
与.rotate.x = Math.PI
。这是更有希望的,但z
轴不再符合z-index的HTML概念。不过,这是我现在使用的。在HTML中,请勿使用
top
,请使用bottom
。 In SVG,在<g transform="translate(0, imageHeight)">
内部做一个<g transform="scale(1, -1)">
。不过,我觉得这会让开发人员感到困惑,并且必须始终保持最新状态,这又是一个负担。
有没有人想出更好的东西?也许一个图书馆来帮助这个?
我认为解决方案是使用THREE.js约定为SVG/HTML创建一个世界坐标系。所以屏幕的中心(称为视口)是0,0,0。因此,SVG/HTML中的对象通过viewport.center(0,0,0)+ viewport.halfWidth进行转换。 – beiller 2014-12-16 15:36:58
@beiller:我不明白这是如何解决翻转的y轴问题,这是我的问题。 : - /我错过了什么? – mhelvens 2014-12-16 16:30:17
也许你是,或者它可能不适合你的情况。例如:你在世界坐标(2,0,0)处有一个CSS精灵。要绘制精灵,您可以使用以下公式:pos.x + viewportCenter.x + viewportHalfWidth.x - object.halfWidth.x。这意味着假设(0,0,0)视口和10x10精灵和800x600尺寸,您可以从窗口左侧的397px处绘制x。 – beiller 2014-12-16 20:30:55