帮助在HTML5 Canvas中模拟深度

时间:2010-08-29 00:38:10

标签: javascript html5 3d canvas

基本上,我正在尝试使用深度模拟在2D画布上进行3D投影。作为一般规则,远离身体的身体比靠近观察者的身体更“阴影”更小。唯一缺少的就是身体越来越远,身体越来越近。

有时,更远的身体被拉到更近的身体后面,但是总是会有较小的身体被吸引到较大的身体前面,这意味着更远的身体有时会出现在身体的前面。近。

我尝试通过z位置对主体进行排序来解决它。 bodies数组是一个对象数组,其中0包含一个正文位置的数组,0是x,1是y,2是z。我首先根据x,y和z轴的旋转更新实体的位置,存储到主体对象的np值中,然后进行排序,并绘制实体。我已经尝试改变数组的排序方式,改变循环的顺序,但仍然没有雪茄。

只是想知道是否有人能指出我正确的方向让这个3D“引擎”表现正常。任何帮助表示赞赏。一些快速注意事项:使用Q / A,W / S和E / D键完成沿三个轴的旋转,使用R / F键完成z轴的放大和缩小,以及默认旋转z轴可以使用P键完成。我想要做的就是在这里:

http://jsbin.com/aholu/5/

3 个答案:

答案 0 :(得分:2)

您正在对原始xyz值进行排序,而不是对已转换的np值进行排序。我通过切换来让它看起来正确......

    bodies.sort(function(a,b) {return a[0][2]-b[0][2]});
to
    bodies.sort(function(a,b) {return a.np[1]-b.np[1]});

有变更,请参阅http://home.comcast.net/~trochoid/mod5.html

我没有遵循您的所有代码,因此这可能不是一个完整的解决方案。具体来说,我认为它将在np [2]上对变换的z值进行排序,但是np [1]给出了正确的结果。我想也许你可以切换这些坐标。此外,看起来您正在转换和投影z值,并且上面的代码修复对此投影的z值进行排序。它似乎工作正常,但我从来没有预测z值本身,只需使用转换后的z来投影xy。无论如何,看起来不错!

答案 1 :(得分:0)

摆线。我不得不从另一台计算机访问,仍然没有注册,所以我必须添加这个作为答案而不是评论。

如果您注意到,旋转任何其他轴时旋转x和y的旋转轴(例如,如果按W旋转,然后旋转不同的轴,然后再次按W,您会注意到螺旋线在你的代码中以相同的方式旋转)。 Ť

他的z轴并非如此。无论您如何旋转x轴和y轴,z轴将始终“从右向左”旋转(例如,在默认配置中,螺旋沿z轴螺旋,或者使用E / D键旋转轴,但是如果沿任何其他轴旋转螺旋线,使用E / D键旋转不再螺旋螺旋线)。

我不知道为什么该轴的行为会有所不同,所以我希望得到您的帮助以使该轮换正常工作。谢谢。

答案 2 :(得分:0)

我知道这并没有回答原来的问题,但是根据你想要取得的成就,一般都要注意还有'视差滚动'(example)(特别是在CSS3中)({ {3}})。