<!DOCTYPE
html
>
<
html
>
<
head
lang=
"en"
>
<
meta
charset=
"UTF-8"
>
<
title
>
3dmodel的load
</
title
>
<
script
src=
"./thresJS/chapter7A/js/three.js"
></
script
>
<!-- 引入控制 器 简单说用鼠标控制模型进行旋转移动-->
<
script
src=
"./thresJS/chapter7A/js/controls/TrackballControls.js"
></
script
>
<!--模型加载器,将vtk格式的3d文件转化为js可解析的文件-->
<
script
src=
"./thresJS/chapter7A/js/loaders/VTKLoader.js"
></
script
>
<!--兼容检测插件(1)判断canvas兼容。(2)判断webgl兼容性。(3)在页面添加不兼容提示信息。-->
<
script
src=
"./thresJS/chapter7A/js/Detector.js"
></
script
>
<!--插件:性能检测器-->
<
script
src=
"./thresJS/chapter7A/js/Stats.js"
></
script
>
<
style
>
body
{
font-family
:
Monospace
;
background-color
:
#000
;
color
:
#fff
;
margin
:
0
;
overflow
:
hidden
;
}
#info
{
color
:
#fff
;
position
:
absolute
;
top
:
10
px
;
width
:
100
%;
text-align
:
center
;
z-index
:
100
;
display
:
block
;
}
#info a
, .
button
{
color
:
#f00
;
font-weight
:
bold
;
text-decoration
:
underline
;
cursor
:
pointer
}
</
style
>
</
head
>
<
body
>
<
div
id=
"info"
></
div
>
<
script
>
if
(!
Detector
.
webgl
)
Detector
.
addGetWebGLMessage
()
/*判断webgl兼容性,并添加不兼容提示信息*/
var
container
,
stats
,
control
,
camera
,
renderer
,
scene
,
cross
;
init
();
animate
();
function
init
(){
/*透视相机的参数第一个代表着相机的张开的视角,类似于你自己眼睛睁开的大小,第二个就是相片(也就是成像)的宽高比例 剩下的两个参数分别是照相机到视景体最近、最远的距离,均为正值,且far应大于near*/
camera
=
new
THREE
.
PerspectiveCamera
(
60
,
window
.
innerWidth
/
window
.
innerHeight
,
0.01
,
1e10
);
/*定位相机的位置,下面代表相机的位置是(0,0,0.2)*/
camera
.
position
.
z
=
0.2
;
/*实例化控制器*/
control
=
new
THREE
.
TrackballControls
(
camera
);
/*按住鼠标左键旋转模型的速度*/
control
.
rotateSpeed
=
5.0
;
/*鼠标滚轮,放大或缩小模型的速度*/
control
.
zoomSpeed
=
5
;
/*鼠标右键平移模型的速度*/
control
.
panSpeed
=
2
;
/*禁用鼠标的滚轮滚动,缩小放大模型的功能*/
control
.
noZoom
=
false
;
/*禁用鼠标右键平移的功能*/
control
.
noPan
=
false
;
/*控制模型的惯性 ,true是没有惯性,不确定,待实验*/
control
.
staticMoving
=
false
;
/*动态阻尼系数,取值范围实在0-1之间就是灵敏度,值越小,就越灵敏,对左键共的功能的影响,值越大,使用左键旋转的时候,模型就会像震动一样,幅度和你移动鼠标的距离有关,但值过大的时候。如0.7点到左键模型就会疯狂旋转,
* 对右键的影响,值越大,平移的速度和距离就会变短
*对滚轮的影响的是,值越大滚轮滚动后,放大和缩小的速率就会变慢
* */
control
.
dynamicDampingFactor
=
0.3
;
/*实例化场景*/
scene
=
new
THREE
.
Scene
();
/*将相机对象放入到场景中去*/
scene
.
add
(
camera
);
/*方向光可以看成是平行光*/
var
dirLight
=
new
THREE
.
DirectionalLight
(
0xfffffff
);
dirLight
.
position
.
set
(
200
,
200
,
1000
).
normalize
();
/*下面这行代码是将光源放进相机的镜头中,这样随着镜头的移动那你看模型的所有部分,否则当你将光源利用scene.add()放进场景中之后,你旋转模型之后会发现,模型的背后就是黑色的*/
camera
.
add
(
dirLight
);
/*未发现这句代码的用处,因为删除之后没有影响*/
camera
.
add
(
dirLight
.
target
);
/*兰伯特网孔材料*/
var
material
=
new
THREE
.
MeshLambertMaterial
({
color
:
0xffffff
,
side
:
THREE
.
DoubleSide
});
/*加载3d模型*/
var
load
=
new
THREE
.
VTKLoader
();
load
.
addEventListener
(
'load'
,
function
(event){
var
geometry
=event.
content
;
var
mesh
=
new
THREE
.
Mesh
(
geometry
,
material
);
mesh
.
position
.
setY
(-
0.09
);
scene
.
add
(
mesh
)
});
load
.
load
(
"bunny.vtk"
);
/*生成渲染器对象,antialias属性是布尔值;代表是否要锯齿效果*/
renderer
=
new
THREE
.
WebGLRenderer
({
antialias
:
false
});
/*设置清楚渲染器颜色和透明度,但是在官方文档中发现,方法应该是setClearColor,下面的应该是老版本的*/
renderer
.
setClearColor
(
0x000000
,
1
);
/*设置渲染器的宽高,与画布一样大小*/
renderer
.
setSize
(
window
.
innerWidth
,
window
.
innerHeight
);
/*建立dom节点,将渲染加入该节点,用以渲染canvas,*/
container
=
document
.
createElement
(
'div'
);
document
.
body
.
appendChild
(
container
);
container
.
appendChild
(
renderer
.
domElement
);
/*性能检测插件的对象生成*/
stats
=
new
Stats
();
stats
.
domElement
.
style
.
position
=
'absolute'
;
stats
.
domElement
.
style
.
top
=
"0px"
;
container
.
appendChild
(
stats
.
domElement
);
/*监听windows窗口的大小变化*/
window
.
addEventListener
(
"resize"
,
onWindowResize
,
false
)
}
function
onWindowResize
(){
camera
.
aspect
=
window
.
innerWidth
/
window
.
innerHeight
;
/*更新相机投影矩阵,必须在参数发生变化后调用。*/
camera
.
updateProjectionMatrix
();
renderer
.
setSize
(
window
.
innerWidth
,
window
.
innerHeight
);
/*用在窗口大小变换时候执行,目前未发现其作用 */
control
.
handleResize
()
}
function
animate
(){
/*游戏循环的实现*/
requestAnimationFrame
(
animate
);
control
.
update
();
renderer
.
render
(
scene
,
camera
);
stats
.
update
();
}
</
script
>
</
body
>
</
html
>