【发布时间】:2014-10-21 02:51:44
【问题描述】:
我的目标是创建一个交互式地球,它的线条与地表垂直,这样您就可以点击它们,它会调出我的医疗团队从世界各地拍摄的照片。我已经对世界进行了完全编码(或者更准确地说,是其他人完成的,我做了一些小改动)。
以下是按预期运行的地球代码。我想知道的是如何使线条垂直于表面并使它们可点击。如果线条在旋转到地球背面时褪色并消失,或者用户旋转地球并且用户看不到一侧的线条褪色,那将是最佳选择。
我想过制作一系列城市并在球体上关联一个位置,但我不太确定该怎么做。一般来说,我对 Three.js 和 HTML/JS 很陌生。
知道我正在使用 three.mins.js、Detector.js 和 TrackballControl.js 可能会有所帮助
代码如下:
(function () {
var webglEl = document.getElementById('webgl');
if (!Detector.webgl) {
Detector.addGetWebGLMessage(webglEl);
return;
}
var width = window.innerWidth,
height = window.innerHeight;
// Earth params
var radius = 0.5,
segments = 32,
rotation = 6;
var scene = new THREE.Scene();
var uniforms, mesh, meshes =[];
var camera = new THREE.PerspectiveCamera(45, width / height, 0.01, 1000);
camera.position.z = 1.5;
var renderer = new THREE.WebGLRenderer();
renderer.setSize(width, height);
scene.add(new THREE.AmbientLight(0x333333));
var light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(5,3,5);
scene.add(light);
var sphere = createSphere(radius, segments);
sphere.rotation.y = rotation;
scene.add(sphere)
var clouds = createClouds(radius, segments);
clouds.rotation.y = rotation;
scene.add(clouds)
var stars = createStars(90, 64);
scene.add(stars);
var controls = new THREE.TrackballControls(camera);
webglEl.appendChild(renderer.domElement);
render();
function render() {
controls.update();
sphere.rotation.y += 0.0005;
clouds.rotation.y += 0.0007;
requestAnimationFrame(render);
renderer.render(scene, camera);
}
function createSphere(radius, segments) {
return new THREE.Mesh(
new THREE.SphereGeometry(radius, segments, segments),
new THREE.MeshPhongMaterial({
map: THREE.ImageUtils.loadTexture('images/Color_Map.jpg'),
bumpMap: THREE.ImageUtils.loadTexture('images/elev_bump_4k.jpg'),
bumpScale: 0.005,
specularMap: THREE.ImageUtils.loadTexture('images/water_4k.png'),
specular: new THREE.Color('grey')
})
);
}
function createClouds(radius, segments) {
return new THREE.Mesh(
new THREE.SphereGeometry(radius + 0.003, segments, segments),
new THREE.MeshPhongMaterial({
map: THREE.ImageUtils.loadTexture('images/fair_clouds_4k.png'),
transparent: true
})
);
}
function createStars(radius, segments) {
return new THREE.Mesh(
new THREE.SphereGeometry(radius, segments, segments),
new THREE.MeshBasicMaterial({
map: THREE.ImageUtils.loadTexture('images/galaxy_starfield.png'),
side: THREE.BackSide
})
);
}
}());
希望它看起来像这个链接,但带有地球而不是建筑物 (http://3d.cl3ver.com/uWfsD?tryitlocation=3) [去那里时也点击探索]。
【问题讨论】:
-
把你的任务分成几个,每个本身就是一个微不足道的中学几何: 1. 射线和球体的交点(从屏幕上的鼠标点射出的射线垂直于屏幕表面) 2. 在你知道了相交和你击中的多边形之后 - 获得它的法线也是微不足道的
-
@zerkms,他不想计算法线,你读过他的整个问题吗?
-
@LucasdeAlmeida 我有。 “我想知道的是如何使线条垂直于表面并使其可点击。” --- 请你不要那么讽刺,并指出我错在哪里吗?
-
@zerkms,您是否阅读过“希望它看起来像这个链接但带有地球而不是建筑物 (3d.cl3ver.com/uWfsD?tryitlocation=3) [去那里时也点击探索] 部分。” ?也许他没有尽可能地表达他的问题,但是如果您看到他给我们的链接,就可以理解他想要什么,而不是计算与交叉点垂直的线的问题。
标签: javascript html three.js