裁切平面(clipping plane)

裁切平面(clipping plane)

更多有趣示例 尽在小红砖社区

示例

在这里插入图片描述

HTML

<!DOCTYPE html>
<html lang="en">
	<head>
		<title>three.js webgl - clipIntersection</title>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
		<style>
			body {
				margin: 0px;
				background-color: #000000;
				overflow: hidden;
			}
		</style>
	</head>
	<body>

<script src="https://threejs.org/build/three.js"></script>

<script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
	<script src="https://cdn.jsdelivr.net/npm/[email protected]/build/dat.gui.min.js"></script>

		<script>

			var camera, scene, renderer;

			var params = {
				clipIntersection: true,
				planeConstant: 0,
				showHelpers: false
			};

			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 )
			];
      
      var clipPlane = new THREE.Plane( new THREE.Vector3( 1, 0, 0 ), 0 )

			init();
			render();

			function init() {

				renderer = new THREE.WebGLRenderer( { antialias: true } );
				renderer.setPixelRatio( window.devicePixelRatio );
				renderer.setSize( window.innerWidth, window.innerHeight );
				renderer.localClippingEnabled = true;
				document.body.appendChild( renderer.domElement );

				scene = new THREE.Scene();

				camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 0.8, 200 );

				camera.position.set( - 1.5, 2.5, 3.0 );

				var controls = new THREE.OrbitControls( camera, renderer.domElement );
				controls.addEventListener( 'change', render ); // use only if there is no animation loop
				controls.minDistance = 1;
				controls.maxDistance = 10;
				controls.enablePan = false;

				var light = new THREE.HemisphereLight( 0xffffff, 0x080808, 1.5 );
				light.position.set( - 1.25, 1, 1.25 );
				scene.add( light );

				// var helper = new THREE.CameraHelper( light.shadow.camera );
				// scene.add( helper );

				//

				var group = new THREE.Group();

				for ( var i = 1; i <= 50; i += 2 ) {

					var geometry = new THREE.SphereBufferGeometry( i / 30, 48, 24 );

					var material = new THREE.MeshLambertMaterial( {

						color: new THREE.Color().setHSL( Math.random(), 0.5, 0.5 ),
						side: THREE.DoubleSide,
						clippingPlanes: clipPlanes,
						clipIntersection: params.clipIntersection

					} );

					group.add( new THREE.Mesh( geometry, material ) );

				}

				scene.add( group );

				// helpers

				var helpers = new THREE.Group();
				helpers.add( new THREE.PlaneHelper( clipPlanes[ 0 ], 2, 0xff0000 ) );
				helpers.add( new THREE.PlaneHelper( clipPlanes[ 1 ], 2, 0x00ff00 ) );
				helpers.add( new THREE.PlaneHelper( clipPlanes[ 2 ], 2, 0x0000ff ) );
				helpers.visible = false;
				scene.add( helpers );

				// gui

				var gui = new dat.GUI();

				gui.add( params, 'clipIntersection' ).name( 'clip intersection' ).onChange( function ( value ) {

					var children = group.children;

					for ( var i = 0; i < children.length; i ++ ) {

						children[ i ].material.clipIntersection = value;

					}

					render();

				} );

				gui.add( params, 'planeConstant', - 1, 1 ).step( 0.01 ).name( 'plane constant' ).onChange( function ( value ) {

					for ( var j = 0; j < clipPlanes.length; j ++ ) {

						clipPlanes[ j ].constant = value;

					}

					render();

				} );

				gui.add( params, 'showHelpers' ).name( 'show helpers' ).onChange( function ( value ) {

					helpers.visible = value;

					render();

				} );

				//

				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>

猜你喜欢

转载自blog.csdn.net/weixin_45544796/article/details/107344024
今日推荐