threejs官方demo:clipping.html源码学习
生活随笔
收集整理的這篇文章主要介紹了
threejs官方demo:clipping.html源码学习
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前言
gihub源碼
效果演示
開始
初始化
function init() {// 初始化camera = new THREE.PerspectiveCamera(36,window.innerWidth / window.innerHeight,0.25,16);camera.position.set(0, 1.3, 3);scene = new THREE.Scene();// 燈光// Lightsscene.add(new THREE.AmbientLight(0x505050));var spotLight = new THREE.SpotLight(0xffffff);spotLight.angle = Math.PI / 5;spotLight.penumbra = 0.2;spotLight.position.set(2, 3, 3);spotLight.castShadow = true;spotLight.shadow.camera.near = 3;spotLight.shadow.camera.far = 10;spotLight.shadow.mapSize.width = 1024;spotLight.shadow.mapSize.height = 1024;scene.add(spotLight);var dirLight = new THREE.DirectionalLight(0x55505a, 1);dirLight.position.set(0, 3, 0);dirLight.castShadow = true;dirLight.shadow.camera.near = 1;dirLight.shadow.camera.far = 10;dirLight.shadow.camera.right = 1;dirLight.shadow.camera.left = -1;dirLight.shadow.camera.top = 1;dirLight.shadow.camera.bottom = -1;dirLight.shadow.mapSize.width = 1024;dirLight.shadow.mapSize.height = 1024;scene.add(dirLight);// 裁剪平面// ***** Clipping planes: *****var localPlane = new THREE.Plane(new THREE.Vector3(0, -1, 0), 0.8);var globalPlane = new THREE.Plane(new THREE.Vector3(-1, 0, 0), 0.1);// 幾何體var material = new THREE.MeshPhongMaterial({color: 0x80ee10,shininess: 1000,side: THREE.DoubleSide,// 設(shè)置裁剪平面// ***** Clipping setup (material): *****clippingPlanes: [localPlane],clipShadows: false});var geometry = new THREE.TorusKnotBufferGeometry(0.4, 0.08, 95, 20);object = new THREE.Mesh(geometry, material);object.castShadow = true;scene.add(object);var ground = new THREE.Mesh(new THREE.PlaneBufferGeometry(9, 9, 1, 1),new THREE.MeshPhongMaterial({color: 0xa0adaf,shininess: 150}));ground.rotation.x = -Math.PI / 2; // rotates X/Y to X/Zground.receiveShadow = true;scene.add(ground);// Rendererrenderer = new THREE.WebGLRenderer();renderer.shadowMap.enabled = true;renderer.setPixelRatio(window.devicePixelRatio);renderer.setSize(window.innerWidth, window.innerHeight);// window.addEventListener("resize", onWindowResize, false);document.body.appendChild(renderer.domElement);// ***** Clipping setup (renderer): *****var globalPlanes = [globalPlane],Empty = Object.freeze([]);// 全局裁剪renderer.clippingPlanes = Empty; // GUI sets it to globalPlanes// 是否可以裁剪renderer.localClippingEnabled = true;// controlvar controls = new OrbitControls(camera, renderer.domElement);controls.target.set(0, 1, 0);controls.update();var gui = new GUI(),folderLocal = gui.addFolder("Local Clipping"),propsLocal = {get Enabled() {return renderer.localClippingEnabled;},set Enabled(v) {renderer.localClippingEnabled = v;},get Shadows() {return material.clipShadows;},set Shadows(v) {material.clipShadows = v;},get Plane() {return localPlane.constant;},set Plane(v) {localPlane.constant = v;}},folderGlobal = gui.addFolder("Global Clipping"),propsGlobal = {get Enabled() {return renderer.clippingPlanes !== Empty;},set Enabled(v) {renderer.clippingPlanes = v ? globalPlanes : Empty;},get Plane() {return globalPlane.constant;},set Plane(v) {globalPlane.constant = v;}};folderLocal.add(propsLocal, "Enabled");folderLocal.add(propsLocal, "Shadows");folderLocal.add(propsLocal, "Plane", 0.3, 1.25);folderGlobal.add(propsGlobal, "Enabled");folderGlobal.add(propsGlobal, "Plane", -0.4, 3);// StartstartTime = Date.now();}如何設(shè)置clip
一般使用裁剪都使用plane生成一個(gè)平面進(jìn)行裁剪
-
第一個(gè)參數(shù)是平面生成的方向
- localPlane 是一個(gè)平行xy面的平面
- globalPlane是平行yz方向的平面
-
第二個(gè)參數(shù)是constant的值
- 用于指定裁剪的位置
然后被裁剪的幾何體與裁剪進(jìn)行綁定
var material = new THREE.MeshPhongMaterial({color: 0x80ee10,shininess: 1000,// 這個(gè)值也很有意思side: THREE.DoubleSide,// 設(shè)置裁剪平面// ***** Clipping setup (material): *****clippingPlanes: [localPlane],clipShadows: false// 設(shè)置裁剪的影子是否會(huì)影響});如果是backside則代表渲染只影響內(nèi)層
如果是frontside則代表渲染只影響外層
如果是doubleside則代表渲染2層都有影響
意義:如果對(duì)于一些幾何體確認(rèn)只渲染表面,就可以設(shè)置單層渲染,可以減低性能的消耗。
這個(gè)大家在使用的時(shí)候設(shè)置下就可以清晰的看見區(qū)別。
全局裁剪
這個(gè)例子也提供了一個(gè)快速進(jìn)行全局裁剪的方法
直接對(duì)renderer渲染器進(jìn)行裁剪
拓展:多個(gè)裁剪平面
這個(gè)也是官方例子有說明
演示地址
我們直接看關(guān)鍵的部分
function createPlaneStencilGroup(geometry, plane, renderOrder) {var group = new THREE.Group();var baseMat = new THREE.MeshBasicMaterial();baseMat.depthWrite = false;baseMat.depthTest = false;baseMat.colorWrite = false;baseMat.stencilWrite = true;baseMat.stencilFunc = THREE.AlwaysStencilFunc;// back facesvar mat0 = baseMat.clone();mat0.side = THREE.BackSide;mat0.clippingPlanes = [plane];mat0.stencilFail = THREE.IncrementWrapStencilOp;mat0.stencilZFail = THREE.IncrementWrapStencilOp;mat0.stencilZPass = THREE.IncrementWrapStencilOp;var mesh0 = new THREE.Mesh(geometry, mat0);mesh0.renderOrder = renderOrder;group.add(mesh0);// front facesvar mat1 = baseMat.clone();mat1.side = THREE.FrontSide;mat1.clippingPlanes = [plane];mat1.stencilFail = THREE.DecrementWrapStencilOp;mat1.stencilZFail = THREE.DecrementWrapStencilOp;mat1.stencilZPass = THREE.DecrementWrapStencilOp;var mesh1 = new THREE.Mesh(geometry, mat1);mesh1.renderOrder = renderOrder;group.add(mesh1);return group; }這里有3個(gè)參數(shù)
分別是
總結(jié)
以上是生活随笔為你收集整理的threejs官方demo:clipping.html源码学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VM中centos中设置共享文件夹
- 下一篇: CentOS7设置共享文件夹