Raycaster.html 7.6 KB
Newer Older
N
nicholas 已提交
1 2 3 4 5 6 7 8 9 10
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="utf-8" />
		<base href="../../../" />
		<script src="list.js"></script>
		<script src="page.js"></script>
		<link type="text/css" rel="stylesheet" href="page.css" />
	</head>
	<body>
G
gogoend 已提交
11
		<h1>光线投射[name]</h1>
N
nicholas 已提交
12 13

		<p class="desc">
G
gogoend 已提交
14 15
			这个类用于进行[link:https://en.wikipedia.org/wiki/Ray_casting raycasting](光线投射)。
			光线投射用于进行鼠标拾取(在三维空间中计算出鼠标移过了什么物体)。
N
nicholas 已提交
16 17
		</p>

18
		<h2>示例</h2>
N
nicholas 已提交
19 20 21 22 23 24
		<code>
		var raycaster = new THREE.Raycaster();
		var mouse = new THREE.Vector2();

		function onMouseMove( event ) {

25
			// 将鼠标位置归一化为设备坐标。x 和 y 方向的取值范围是 (-1 to +1)
N
nicholas 已提交
26 27 28 29 30 31 32 33

			mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
			mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;

		}

		function render() {

34
			// 通过摄像机和鼠标位置更新射线
N
nicholas 已提交
35 36
			raycaster.setFromCamera( mouse, camera );

37
			// 计算物体和射线的焦点
N
nicholas 已提交
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
			var intersects = raycaster.intersectObjects( scene.children );

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

				intersects[ i ].object.material.color.set( 0xff0000 );

			}

			renderer.render( scene, camera );

		}

		window.addEventListener( 'mousemove', onMouseMove, false );

		window.requestAnimationFrame(render);

		</code>
		<div>
56
			其它示例:<br>[example:webgl_interactive_cubes Raycasting to a Mesh]<br />
N
nicholas 已提交
57 58
			[example:webgl_interactive_cubes_ortho Raycasting to a Mesh in using an OrthographicCamera]<br />
			[example:webgl_interactive_buffergeometry Raycasting to a Mesh with BufferGeometry]<br />
W
webglzhang 已提交
59
			[example:webgl_instancing_raycast Raycasting to a InstancedMesh]<br />
N
nicholas 已提交
60 61 62 63 64 65 66 67 68 69 70 71
			[example:webgl_interactive_lines Raycasting to a Line]<br />
			[example:webgl_interactive_raycasting_points Raycasting to Points]<br />
			[example:webgl_geometry_terrain_raycast Terrain raycasting]<br />
			[example:webgl_interactive_voxelpainter Raycasting to paint voxels]<br />
			[example:webgl_raycast_texture Raycast to a Texture]
		</div>


		<p>
		</p>


G
gogoend 已提交
72
		<h2>构造器</h2>
N
nicholas 已提交
73 74 75

		<h3>[name]( [param:Vector3 origin], [param:Vector3 direction], [param:Float near], [param:Float far] ) {</h3>
		<p>
G
gogoend 已提交
76 77 78 79
		[page:Vector3 origin] —— 光线投射的原点向量。<br />
		[page:Vector3 direction] —— 向射线提供方向的方向向量,应当被标准化。<br />
		[page:Float near] —— 返回的所有结果比near远。near不能为负值,其默认值为0。<br />
		[page:Float far] —— 返回的所有结果都比far近。far不能小于near,其默认值为Infinity(正无穷。)</p>
N
nicholas 已提交
80
		<p>
G
gogoend 已提交
81
			这将创建一个新的raycaster对象。<br />
82

N
nicholas 已提交
83 84 85
		</p>


86
		<h2>属性</h2>
N
nicholas 已提交
87 88 89

		<h3>[property:float far]</h3>
		<p>
G
gogoend 已提交
90 91
			raycaster的远距离因数(投射远点)。这个值表明哪些对象可以基于该距离而被raycaster所丢弃。
			这个值不应当为负,并且应当比near属性大。
N
nicholas 已提交
92 93 94 95
		</p>

		<h3>[property:float linePrecision]</h3>
		<p>
96

G
gogoend 已提交
97
			raycaster与[page:Line](线)物体相交时的精度因数。
98

N
nicholas 已提交
99 100 101 102
		</p>

		<h3>[property:float near]</h3>
		<p>
G
gogoend 已提交
103 104
			raycaster的近距离因数(投射近点)。这个值表明哪些对象可以基于该距离而被raycaster所丢弃。
			这个值不应当为负,并且应当比near属性小。
N
nicholas 已提交
105 106
		</p>

107 108 109 110 111 112 113 114
		<h3>[property:Camera camera]</h3>
		<p>
		The camera to use when raycasting against view-dependent objects such as billboarded objects like [page:Sprites]. This field
		can be set manually or is set when calling "setFromCamera".

		Defaults to null.
		</p>

N
nicholas 已提交
115 116
		<h3>[property:Object params]</h3>
		<p>
117
			具有以下属性的对象:<code>
N
nicholas 已提交
118 119 120 121 122 123 124 125 126 127 128 129
{
	Mesh: {},
	Line: {},
	LOD: {},
	Points: { threshold: 1 },
	Sprite: {}
}
			</code>

		</p>

		<h3>[property:Ray ray]</h3>
G
gogoend 已提交
130
		<p>用于进行光线投射的[Page:Ray](射线)。</p>
N
nicholas 已提交
131 132


133
		<h2>方法</h2>
N
nicholas 已提交
134 135 136

		<h3>[method:null set]( [param:Vector3 origin], [param:Vector3 direction] )</h3>
		<p>
G
gogoend 已提交
137 138
		[page:Vector3 origin] —— 光线投射的原点向量。<br />
		[page:Vector3 direction] —— 为光线提供方向的标准化方向向量。
N
nicholas 已提交
139 140
		</p>
		<p>
G
gogoend 已提交
141
			使用一个新的原点和方向来更新射线。
N
nicholas 已提交
142 143 144 145
		</p>

		<h3>[method:null setFromCamera]( [param:Vector2 coords], [param:Camera camera] )</h3>
		<p>
G
gogoend 已提交
146
		[page:Vector2 coords] —— 在标准化设备坐标中鼠标的二维坐标 —— X分量与Y分量应当在-1到1之间。<br />
M
Mugen87 已提交
147

G
gogoend 已提交
148
		[page:Camera camera] —— 射线所来源的摄像机。
N
nicholas 已提交
149 150
		</p>
		<p>
G
gogoend 已提交
151
			使用一个新的原点和方向来更新射线。
N
nicholas 已提交
152 153 154 155
		</p>

		<h3>[method:Array intersectObject]( [param:Object3D object], [param:Boolean recursive], [param:Array optionalTarget] )</h3>
		<p>
G
gogoend 已提交
156 157 158
		[page:Object3D object] —— 检查与射线相交的物体。<br />
		[page:Boolean recursive] —— 若为true,则同时也会检查所有的后代。否则将只会检查对象本身。默认值为false。<br />
		[page:Array optionalTarget] — (可选)设置结果的目标数组。如果不设置这个值,则一个新的[page:Array]会被实例化;如果设置了这个值,则在每次调用之前必须清空这个数组(例如:array.length = 0;)。
N
nicholas 已提交
159 160
		</p>
		<p>
G
gogoend 已提交
161
			检测所有在射线与物体之间,包括或不包括后代的相交部分。返回结果时,相交部分将按距离进行排序,最近的位于第一个。<br>
G
gogoend 已提交
162
			该方法返回一个包含有交叉部分的数组:
N
nicholas 已提交
163 164 165 166 167
		</p>
		<code>
				[ { distance, point, face, faceIndex, object }, ... ]
		</code>
		<p>
G
gogoend 已提交
168 169 170 171 172
			[page:Float distance] —— 射线投射原点和相交部分之间的距离。<br />
			[page:Vector3 point] —— 相交部分的点(世界坐标)<br />
			[page:Face3 face] —— 相交的面<br />
			[page:Integer faceIndex] —— 相交的面的索引<br />
			[page:Object3D object] —— 相交的物体<br />
M
Mugen87 已提交
173
			[page:Vector2 uv] —— 相交部分的点的UV坐标。<br />
W
webglzhang 已提交
174 175
			[page:Vector2 uv2] —— Second set of U,V coordinates at point of intersection<br />
			[page:Integer instanceId] – The index number of the instance where the ray intersects the InstancedMesh
N
nicholas 已提交
176 177
		</p>
		<p>
G
gogoend 已提交
178 179
			当计算这条射线是否和物体相交的时候,*Raycaster*将传入的对象委托给[page:Object3D.raycast raycast]方法。
			这将可以让[page:Mesh mesh]对于光线投射的响应不同于[page:Line lines]和[page:Points pointclouds]。
N
nicholas 已提交
180 181
		</p>
		<p>
G
gogoend 已提交
182 183 184
			<strong>请注意</strong>:对于网格来说,面必须朝向射线的原点,以便其能够被检测到。
			用于交互的射线穿过面的背侧时,将不会被检测到。如果需要对物体中面的两侧进行光线投射,
			你需要将[page:Mesh.material material]中的[page:Material.side side]属性设置为*THREE.DoubleSide*。
N
nicholas 已提交
185 186 187 188
		</p>

		<h3>[method:Array intersectObjects]( [param:Array objects], [param:Boolean recursive], [param:Array optionalTarget] )</h3>
		<p>
G
gogoend 已提交
189 190
		[page:Array objects] —— 检测和射线相交的一组物体。<br />
		[page:Boolean recursive] —— 若为true,则同时也会检测所有物体的后代。否则将只会检测对象本身的相交部分。默认值为false。<br />
G
gogoend 已提交
191
		[page:Array optionalTarget] —— (可选)设置结果的目标数组。如果不设置这个值,则一个新的[page:Array]会被实例化;如果设置了这个值,则在每次调用之前必须清空这个数组(例如:array.length = 0;)。
N
nicholas 已提交
192 193
		</p>
		<p>
G
gogoend 已提交
194
			检测所有在射线与这些物体之间,包括或不包括后代的相交部分。返回结果时,相交部分将按距离进行排序,最近的位于第一个),相交部分和[page:.intersectObject]所返回的格式是相同的。
N
nicholas 已提交
195 196 197
		</p>


G
gogoend 已提交
198
		<h2>源代码</h2>
N
nicholas 已提交
199

M
Mugen87 已提交
200 201 202
		<p>
			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
		</p>
N
nicholas 已提交
203 204
	</body>
</html>