一、採用threeJs的精靈(Sprite),具體用法查看我另外一篇博客https://my.oschina.net/u/2612473/blog/3038066
二、使用CSS2DRendererjavascript
精靈:文字是在canvas中畫的,精靈的材質就是加載的帶有文字的canvas。
CSS2DRenderer:渲染器是生成一個DIV容器,它的做用是能把HTML元素綁定到三維物體上,在DIV容器中各自的DOM元素分別封裝到CSS2DObject的實例中,並在scene中增長。css
相對於精靈CSS2DRenderer有更好的靈活性,能夠更好的經過css控制樣式,而且也更方便的進行頁面的跳轉(經過a元素)html
(1)getSize():返回包含寬度和長度的對象java
(2)render ( scene : Scene, camera : Camera ) : null // 用相機渲染場景canvas
(3)setSize (width : Number, height : Number) : null //設置渲染器的寬度和高度app
查看實例效果dom
完整代碼spa
<div class="canvasWrap" id="canvasWrap" style="margin-bottom:15px;"></div>
<script> var camera, scene, scene2, renderer, labelRenderer; var controls; var clock = new THREE.Clock(); var textureLoader = new THREE.TextureLoader(); var width, height; var earth, moon; init(); animate(); function init() { var EARTH_RADIUS = 1; var MOON_RADIUS = 0.27; var container = document.getElementById('canvasWrap') width = document.getElementById('canvasWrap').clientWidth; height = document.getElementById('canvasWrap').clientHeight; camera = new THREE.PerspectiveCamera(45, width / height, 1, 1000); camera.position.set(10, 9, 8); console.log(camera) controls = new THREE.OrbitControls(camera); scene = new THREE.Scene(); scene2 = new THREE.Scene(); var dirLight = new THREE.DirectionalLight(0xffffff); dirLight.position.set(0, 0, 1); scene.add(dirLight); var axesHelper = new THREE.AxesHelper(5); scene.add(axesHelper); var earthGeometry = new THREE.SphereBufferGeometry(EARTH_RADIUS, 16, 16); var earthMaterial = new THREE.MeshPhongMaterial({ specular: 0x333333, //材質的高光顏色。默認值是0x111111 shininess: 5, //高亮的程度,越高的值越閃亮。默認值爲30 //顏色貼圖,默認null.紋理貼圖顏色由漫反射顏色.color調節 map: textureLoader.load('../dist/textures/planets/earth_atmos_2048.jpg'), //鏡面反射貼圖值會影響鏡面高光以及環境貼圖對錶面的影響程度。默認null specularMap: textureLoader.load('../dist/textures/planets/earth_specular_2048.jpg'), //用於建立法線貼圖的紋理。RGB值會影響每一個像素片斷的曲面法線,並更改顏色照亮的方式。法線貼圖不會改變曲面的實際形狀,只會改變光照。 normalMap: textureLoader.load('../dist/textures/planets/earth_normal_2048.jpg'), //法線貼圖對材質的影響程度。典型範圍是0-1 ,默認值是Vector2 設置(1,1) normalScale: new THREE.Vector2(0.85, 0.85) }); earth = new THREE.Mesh(earthGeometry, earthMaterial) scene.add(earth); var moonGeometry = new THREE.SphereBufferGeometry(MOON_RADIUS, 16, 16); var moonMaterial = new THREE.MeshPhongMaterial({ shininess: 5, map: textureLoader.load("../dist/textures/planets/moon_1024.jpg") }); moon = new THREE.Mesh(moonGeometry, moonMaterial); console.log(moon) scene.add(moon); //var earthDiv = '<div><a href="aboutMe.html">earth</a></div>' 用字符串寫元素不行 //earthDiv.style.marginTop = "-1em"; earthDiv = document.getElementById("label1"); earthDiv.style.display = "block" console.log(earthDiv) earthLabel = new THREE.CSS2DObject(earthDiv); earthLabel.position.set(0, EARTH_RADIUS, 0); earth.add(earthLabel); var moonDiv = document.createElement("div"); moonDiv.className = "label"; moonDiv.textContent = "Moon"; //moonDiv.style.marginTop = "-1em"; var moonLabel = new THREE.CSS2DObject(moonDiv); moonLabel.position.set(0, MOON_RADIUS, 0); moon.add(moonLabel); renderer = new THREE.WebGLRenderer(); renderer.setPixelRatio(window.devicePixelRatio); renderer.setSize(width, height); container.appendChild(renderer.domElement); labelRenderer = new THREE.CSS2DRenderer(); labelRenderer.setSize(width, height); labelRenderer.domElement.style.position = "absolute"; labelRenderer.domElement.style.top = 0; container.appendChild(labelRenderer.domElement); } function animate() { requestAnimationFrame(animate); //獲取自時鐘啓動後的秒數 var elapsed = clock.getElapsedTime() / 3; moon.position.set(Math.sin(elapsed) * 5, 0, Math.cos(elapsed) * 5); renderer.render(scene, camera); labelRenderer.render(scene, camera) } </script>
.canvasWrap { position: relative; width: 100%; height: 500px; background: gray; } .label { margin-top: -20px; color: #fff; border: 1px solid #fff; padding: 3px 5px; background: rgba(0, 0, 0, 0.6) }
注意:標籤中顯示的HTML元素能夠在頁面中先寫好並隱藏起來,運行js 的時候再獲取此元素並顯示,不能在js中直接用字符串的形式建立元素,不然會報錯。.net