你好,我想在浏览器中呈现一个交互式的3D球体。它上面的纹理将是世界地图,因此基本上我正在尝试创建一个可以使用地图在任何方向上旋转的地球仪。我熟悉使用SVG渲染2D图像,但不确定如何在SVG中渲染3D形状。 如果可能,在SVG中呈现3D形状吗?如果不能,WebGL是更好的选择吗?
你好,我想在浏览器中呈现一个交互式的3D球体。它上面的纹理将是世界地图,因此基本上我正在尝试创建一个可以使用地图在任何方向上旋转的地球仪。我熟悉使用SVG渲染2D图像,但不确定如何在SVG中渲染3D形状。 如果可能,在SVG中呈现3D形状吗?如果不能,WebGL是更好的选择吗?
请看一下three.js,它可以将实现进行抽象(带有WebGL/SVG/Canvas后端)。
SVG是一个二维矢量图形格式,但是您可以将三维形状投射到二维平面上,因此可以使用SVG渲染三维对象,只需要一些工作量(最好使用JavaScript库实现)。
由于性能问题,WebGL 是您的最佳选择。您可以利用(或至少从中学习)像 http://www.chromeexperiments.com/globe(请参见 http://data-arts.appspot.com/globe-search)这样的演示文稿。此外,还有其他地球仪演示文稿可在 http://www.chromeexperiments.com 上找到。
如果你使用SVG,那么阴影将是一个问题。在SVG中,真正的阴影并不是很可能实现的,尽管在一些特定情况下可以通过伪造来实现。如果模型中有超过十几个多边形,请一定使用WebGL进行3D渲染。
// Language Javascript
// object Point
function Point(x,y,z){
this.x = x;
this.y = y;
this.z = z;
}
// Projection convert point 2D in 3D
function ProjectionPoint(point){
if ( !(point instanceof Point) )
throw new TypeError("ProjectionPoint: incorrect type parameter");
return { x: (point.x<<8)/(point.z+Zorig)+Xorig,
y: (point.y<<8)/(point.z+Zorig)+Yorig,
z:point.z }
}