叉口裁剪球體案例
二話不說先上效果圖:
所有代碼帶註釋
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>clipIntersection</title>
<style>
body {
margin: 0;
background: #000;
overflow: hidden;
}
</style>
</head>
<body>
<script src="../three.js-master/build/three.js"></script>
<script src="../libs/OrbitControls.js"></script>
<script>
var camera, scene, renderer;
// 定義參數,後面定義材質的時候會用到
var params = {
clipIntersection: true
};
// 定義裁剪的切面,後面定義材質的時候會用到
var clipPlanes = [
new THREE.Plane(new THREE.Vector3(1, 0, 0), 0),
new THREE.Plane(new THREE.Vector3(0, -1, 0), 0),
new THREE.Plane(new THREE.Vector3(0, 0, -1), 0)
];
init()
render()
function init() {
// 定義WebGL渲染器,而且開啓抗鋸齒
renderer = new THREE.WebGLRenderer({ antialias: true })
// 設置設備像素比,一般用於HiDPI(一種高清渲染方式)設備防止模糊輸出canvas
renderer.setPixelRatio(window.devicePixelRatio)
// 返回一個包含渲染器輸出canvas寬高的對象,以像素爲單位
renderer.setSize(window.innerWidth, window.innerHeight)
// 定義渲染器是否考慮對象級別的裁剪平面
renderer.localClippingEnabled = true
// 將輸出的canvas添加到body中
document.body.appendChild(renderer.domElement)
// 定義場景和相機而且設置相機的位置
scene = new THREE.Scene()
camera = new THREE.PerspectiveCamera(40, window.innerWidth / window.innerHeight, 0.1, 1000)
camera.position.set(-20, 30, 40)
// 設置鼠標點擊拖拽以後旋轉和滾動滾輪放大縮小
var controls = new THREE.OrbitControls(camera, renderer.domElement)
controls.addEventListener('change', render); // use only if there is no animation loop
controls.minDistance = 10;
controls.maxDistance = 100;
controls.enablePan = false;
// 定義半球光,參數爲天空顏色,地面顏色,光的強度
var light = new THREE.HemisphereLight(0xffffff, 0x080808, 1)
scene.add(light)
// 添加環境光
scene.add(new THREE.AmbientLight(0x505050))
// 這與Object3d幾乎是同樣的,其目的是使用語法上更清晰的對象組進行工做
var group = new THREE.Group()
for (var i = 1; i < 25; i++) {
// 建立球體的緩存幾何模型,參數爲半徑,水平分割面數量,垂直分割面數量
var geometry = new THREE.SphereBufferGeometry(i / 2, 48, 24);
// 定義蘭伯特網口材料,一種非發光材質
var material = new THREE.MeshLambertMaterial({
// 線條的十六進制顏色
color: new THREE.Color(Math.sin(i * 0.5) * 0.5 + 0.5, Math.cos(i * 1.5) * 0.5 + 0.5, Math.sin(i * 4.5 + 0) * 0.5 + 0.5),
// 定義表面兩側的哪個將呈現,默認是前面
side: THREE.DoubleSide,
// 用戶在全局使用THREE.Plane對象定義的裁剪平面,這些平面應用於該材料所附的對象。
// 空間中與平面點積爲負的點將被裁剪掉。缺省爲空 []。
clippingPlanes: clipPlanes,
// 改變剪切平面的行爲,以便只裁剪他們的交集,而不是剪接
clipIntersection: params.clipIntersection
})
// 三角形布成的網格圖形的基類
group.add(new THREE.Mesh(geometry, material))
}
scene.add(group)
window.addEventListener('resize', onWindowResize, false);
}
function onWindowResize() {
// 設置相機視錐體寬高比
camera.aspect = window.innerWidth / window.innerHeight;
// 更新相機投影矩陣
camera.updateProjectionMatrix();
// 設置渲染器寬高
renderer.setSize(window.innerWidth, window.innerHeight);
render();
}
function render() {
renderer.render(scene, camera);
}
</script>
</body>
</html>
代碼知識點詳解
- THREE.Plane
- 該方法是定義一個在三維空間中無線伸展的平面,Plane( normal, constant )
- normal -- (Vector3) 定義平面指向原點的法向量,(1, 0, 0)
- constant -- (Float) 從原點到平面沿法線方向的負距離,默認0
- THREE.Vector3
- 定義一個三維向量,Vector3( x, y, z )
- x,y,z分別表明向量的x,y,z的值
- THREE.WebGLRenderer
- WebGL渲染器使用WebGL來繪製您的場景,若是您的設備支持的話。使用WebGL將可以利用GPU硬件加速從而提升渲染性能。這個渲染器比 Canvas渲染器(CanvasRenderer) 有更好的性能。
- WebGLRenderer( parameters ),parameters能夠不寫,parameters參數介紹:
- canvas:將要渲染到的canvas對象,若是沒有定義將會新建立一個canvas
- context:所須要的渲染上下文對象
- precision:着色器的精度,有"highp","mediump","lowp",若是設備支持的話默認爲"highp"
- alpha:這個canvas是否包含alpha(透明度)緩衝區,默認爲false
- premultipliedAlpha:渲染器是否會假設顏色具備預乘透明度
- antialias:是否抗鋸齒,默認爲false
- stencil:繪製緩衝區是否有一個最少8位的模板緩衝區,默認爲true
- preserveDrawingBuffer:是否保留緩衝區,知道手動清除或者覆蓋,默認爲false
- depth:繪圖緩衝區是否具備至少16位的深度緩衝區,默認爲true
- logarithmicDepthBuffer:是否使用對數深度緩衝區,若是在一個場景中處理巨大的差別可能須要使用它
- renderer.setPixelRatio(PixelRatio),設置設備像素比,一般用於HiDPI設備放置模糊輸出canvas,最好使用新的three.js文件
- renderer.setSize(width,height,updateStyle),調整輸出canvas尺寸,要考慮設備像素比,而且設置視口以匹配改尺寸,若是設置updateStyle爲true則顯示添加像素到輸出canvas的樣式中
- renderer.localClippingEnabled,定義渲染器是否考慮對象級別的裁剪平面
- 他還有不少的屬性和方法,之後在須要的時候再介紹
- THREE.Scene
- 場景容許你設置哪些對象唄three.js渲染而且渲染在哪裏,咱們在場景中放置物體,燈光和相機,他有三個屬性:
- fog,一個fog實例,定義了場景中霧狀北京類型,默認爲null
- overrideMaterial,若是不爲空,它將強制場景中的一切對象都是用該材料進行渲染,默認爲null
- autoUpdate:默認爲true,若是設置爲true,那麼每一幀的渲染都要檢查場景和對象是否須要矩陣更新,不然你必須本身來維護場景中的全部矩陣
- THREE.PerspectiveCamera
- 進行遠景投影的相機,PerspectiveCamera( fov, aspect, near, far )
- FOV,相機視錐體垂直角度
- aspect,相機視錐體寬高比
- near,相機視錐體近裁剪面
- far,相機視錐體遠裁剪面
- camera.position.set(x,y,z),定義相機的位置
- camera.updateProjectionMatrix(),更新相機投影矩陣
- THREE.HemisphereLight
- 位於場景正上方的光源,HemisphereLight( skyColor, groundColor, intensity )
- skyColor,RGB天空顏色值
- groundColor,RGB地面顏色值
- intensity,光的強度
- THREE.AmbientLight
- 定義環境光,AmbientLight( color, intensity ),這種光應用到場景中的全部物體
- color:RGB顏色
- intensity:光的強度
- THREE.SphereBufferGeometry
- 球體緩存幾何模型,SphereBufferGeometry(radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength)
- radius,球體半徑,默認爲50
- widthSegments,水平分割面的數量,最小爲3,默認爲8
- heightSegments,垂直分割面數量,最小爲2,默認爲6
- phiStart,水平起始角度,默認爲0
- phiLength,指定水平掃描角度大小,默認爲Math.PI*2
- thetaStart,垂直起始角度,默認爲0
- thetaLength,指定垂直掃描角度大小,默認爲Math.PI
- THREE.MeshLambertMaterial
- 蘭伯特網口材質,一種非發光材料,無鏡面高光,改材料使用非物理的朗博模型來計算反射率,這能夠模擬一些表面(如未經處理的木材或者石頭),可是不能模擬具備鏡面高光的光澤表面(好比上漆的木頭)
- 陰影使用Gouraud陰影模型計算,這將計算每一個頂點的陰影(在頂點着色器中),並在多邊形的面上插入結果
- 因爲反射率和照明模型的簡單性,性能要比其餘幾個材質更好,代價是圖形的準確行要稍差
- MeshLambertMaterial( parameters )
- color,線條的十六進制顏色,默認爲0xffffff
- side,定義表面兩側的哪個將呈現,前面,後面或者雙面,默認值是THREE.Frontside,其餘可選爲THREE.Backside和THREE.Doubleside
- map,設置紋理貼圖,默認爲null
- lightMap,設置光照貼圖,默認爲null
- lightMapIntensity,設置光照貼圖強度,默認爲1
- aoMap,設置環境遮擋貼圖(ao=ambient occlusion),默認爲null
- aoMapIntensity,設置環境遮擋貼圖強度,默認爲1
- specularMap,高光貼圖,默認爲null
- alphaMap,透明度貼圖,默認爲null
- envMap,環境貼圖,默認爲null
- combine,若是有環境貼圖,如何組合表面顏色的結果,默認爲THREE.Multiply,還有THREE.MixOperation, THREE.AddOperation.若是選擇了mix,反射率用於在兩種顏色之間進行混合
- reflectivity,設置反射率,默認爲1
- refractionRatio,設置折射率默認值是0.98
- fog,定義材質是否受全局霧設置的有影響,默認爲true
- shading,定義着色器,默認爲THREE.SmoothShading
- wireframe,渲染模型爲線框,默認爲false
- wireframeLinewidth,線框線寬度,默認爲1
- wireframeLinecap,定義線端的外觀,默認值是round
- vertexColors:定義頂點如何着色,默認值是THREE.NoColors
- skinning:定義材質是否使用皮膚,默認爲false
- morphTargets:定義是否使用變形目標,默認爲false
- morphNormals:定義材質是否使用morphNormals,若是設置爲true的話將morphNormals從geometry傳遞到着色器,默認爲false
- clippingPlanes,用戶定義的裁剪平面,指定爲世界空間中的THREE.Plane對象。 這些平面應用於該材料所附的對象。空間中與平面點積爲負的點將被裁剪掉。缺省爲空 []
- chipIntersection,改變裁剪平面的行爲,一邊只是裁剪他們的交集而不是剪接
- 還有其餘許多基礎材料的屬性就不在繼續介紹了,會在後續逐漸介紹
- THREE.Mesh
- 網孔對象的基類,Mesh( geometry, material )
- geometry,一個幾何體的實例
- 一個材質的實例