Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Ablesons
three.js
提交
02f4dff0
T
three.js
项目概览
Ablesons
/
three.js
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
three.js
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
02f4dff0
编写于
3月 30, 2021
作者:
M
Mr.doob
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Examples: IFCLoader clean up.
上级
7c1f4773
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
211 addition
and
33 deletion
+211
-33
examples/jsm/loaders/IFCLoader.js
examples/jsm/loaders/IFCLoader.js
+176
-0
examples/webgl_loader_ifc.html
examples/webgl_loader_ifc.html
+35
-33
未找到文件。
examples/jsm/loaders/
ifc/Ifc
Loader.js
→
examples/jsm/loaders/
IFC
Loader.js
浏览文件 @
02f4dff0
//Example: https://github.com/tomvandig/web-ifc-three/tree/main/examples/jsm
import
{
IfcAPI
}
from
"
./web-ifc-api.js
"
;
import
{
IfcAPI
}
from
'
./ifc/web-ifc-api.js
'
;
import
{
FileLoader
,
Loader
,
...
...
@@ -14,83 +14,105 @@ import {
InterleavedBuffer
,
InterleavedBufferAttribute
,
BufferAttribute
,
}
from
"
../../../../build/three.module.js
"
;
var
IFCLoader
=
function
(
manager
)
{
Loader
.
call
(
this
,
manager
);
};
}
from
'
../../../../build/three.module.js
'
;
var
ifcAPI
=
new
IfcAPI
();
ifcAPI
.
Init
();
IFCLoader
.
prototype
=
Object
.
assign
(
Object
.
create
(
Loader
.
prototype
),
{
function
IFCLoader
(
manager
)
{
Loader
.
call
(
this
,
manager
);
}
IFCLoader
.
prototype
=
Object
.
assign
(
Object
.
create
(
Loader
.
prototype
),
{
constructor
:
IFCLoader
,
setDecoderPath
:
function
(
path
)
{
var
loader
=
new
FileLoader
(
this
.
manager
);
loader
.
load
(
url
,
()
=>
{},
undefined
,
()
=>
{});
},
load
:
function
(
url
,
onLoad
,
onProgress
,
onError
)
{
load
:
function
(
url
,
onLoad
,
onProgress
,
onError
)
{
var
scope
=
this
;
var
loader
=
new
FileLoader
(
scope
.
manager
);
loader
.
setPath
(
scope
.
path
);
loader
.
setResponseType
(
"
arraybuffer
"
);
loader
.
setRequestHeader
(
scope
.
requestHeader
);
loader
.
setWithCredentials
(
scope
.
withCredentials
);
var
loader
=
new
FileLoader
(
scope
.
manager
);
loader
.
setPath
(
scope
.
path
);
loader
.
setResponseType
(
'
arraybuffer
'
);
loader
.
setRequestHeader
(
scope
.
requestHeader
);
loader
.
setWithCredentials
(
scope
.
withCredentials
);
loader
.
load
(
url
,
function
(
buffer
)
{
function
(
buffer
)
{
try
{
onLoad
(
scope
.
parse
(
buffer
));
}
catch
(
e
)
{
if
(
onError
)
{
onError
(
e
);
onLoad
(
scope
.
parse
(
buffer
)
);
}
catch
(
e
)
{
if
(
onError
)
{
onError
(
e
);
}
else
{
console
.
error
(
e
);
console
.
error
(
e
);
}
scope
.
manager
.
itemError
(
url
);
scope
.
manager
.
itemError
(
url
);
}
},
onProgress
,
onError
);
},
parse
:
(
function
()
{
return
function
(
buffer
)
{
var
data
=
new
Uint8Array
(
buffer
);
var
modelID
=
ifcAPI
.
OpenModel
(
"
example.ifc
"
,
data
);
return
loadAllGeometry
(
modelID
);
parse
:
(
function
()
{
return
function
(
buffer
)
{
var
data
=
new
Uint8Array
(
buffer
);
var
modelID
=
ifcAPI
.
OpenModel
(
'
example.ifc
'
,
data
);
return
loadAllGeometry
(
modelID
);
function
loadAllGeometry
(
modelID
)
{
var
flatMeshes
=
getFlatMeshes
(
modelID
);
function
loadAllGeometry
(
modelID
)
{
var
flatMeshes
=
getFlatMeshes
(
modelID
);
var
mainObject
=
new
Object3D
();
for
(
var
i
=
0
;
i
<
flatMeshes
.
size
();
i
++
)
{
var
placedGeometries
=
flatMeshes
.
get
(
i
).
geometries
;
for
(
var
j
=
0
;
j
<
placedGeometries
.
size
();
j
++
)
mainObject
.
add
(
getPlacedGeometry
(
modelID
,
placedGeometries
.
get
(
j
)));
for
(
var
i
=
0
;
i
<
flatMeshes
.
size
();
i
++
)
{
var
placedGeometries
=
flatMeshes
.
get
(
i
).
geometries
;
for
(
var
j
=
0
;
j
<
placedGeometries
.
size
();
j
++
)
mainObject
.
add
(
getPlacedGeometry
(
modelID
,
placedGeometries
.
get
(
j
)
)
);
}
return
mainObject
;
}
function
getFlatMeshes
(
modelID
)
{
var
flatMeshes
=
ifcAPI
.
LoadAllGeometry
(
modelID
);
function
getFlatMeshes
(
modelID
)
{
var
flatMeshes
=
ifcAPI
.
LoadAllGeometry
(
modelID
);
return
flatMeshes
;
}
function
getPlacedGeometry
(
modelID
,
placedGeometry
)
{
var
geometry
=
getBufferGeometry
(
modelID
,
placedGeometry
);
var
material
=
getMeshMaterial
(
placedGeometry
.
color
);
var
mesh
=
new
Mesh
(
geometry
,
material
);
mesh
.
matrix
=
getMeshMatrix
(
placedGeometry
.
flatTransformation
);
function
getPlacedGeometry
(
modelID
,
placedGeometry
)
{
var
geometry
=
getBufferGeometry
(
modelID
,
placedGeometry
);
var
material
=
getMeshMaterial
(
placedGeometry
.
color
);
var
mesh
=
new
Mesh
(
geometry
,
material
);
mesh
.
matrix
=
getMeshMatrix
(
placedGeometry
.
flatTransformation
);
mesh
.
matrixAutoUpdate
=
false
;
return
mesh
;
}
function
getBufferGeometry
(
modelID
,
placedGeometry
)
{
function
getBufferGeometry
(
modelID
,
placedGeometry
)
{
var
geometry
=
ifcAPI
.
GetGeometry
(
modelID
,
placedGeometry
.
geometryExpressID
...
...
@@ -103,43 +125,52 @@ IFCLoader.prototype = Object.assign(Object.create(Loader.prototype), {
geometry
.
GetIndexData
(),
geometry
.
GetIndexDataSize
()
);
var
bufferGeometry
=
ifcGeometryToBuffer
(
verts
,
indices
);
var
bufferGeometry
=
ifcGeometryToBuffer
(
verts
,
indices
);
return
bufferGeometry
;
}
function
getMeshMaterial
(
color
)
{
var
col
=
new
Color
(
color
.
x
,
color
.
y
,
color
.
z
);
var
material
=
new
MeshPhongMaterial
({
color
:
col
,
side
:
DoubleSide
});
function
getMeshMaterial
(
color
)
{
var
col
=
new
Color
(
color
.
x
,
color
.
y
,
color
.
z
);
var
material
=
new
MeshPhongMaterial
(
{
color
:
col
,
side
:
DoubleSide
}
);
material
.
transparent
=
color
.
w
!==
1
;
if
(
material
.
transparent
)
material
.
opacity
=
color
.
w
;
if
(
material
.
transparent
)
material
.
opacity
=
color
.
w
;
return
material
;
}
function
getMeshMatrix
(
matrix
)
{
function
getMeshMatrix
(
matrix
)
{
var
mat
=
new
Matrix4
();
mat
.
fromArray
(
matrix
);
mat
.
fromArray
(
matrix
);
// mat.elements[15 - 3] *= 0.001;
// mat.elements[15 - 2] *= 0.001;
// mat.elements[15 - 1] *= 0.001;
return
mat
;
}
function
ifcGeometryToBuffer
(
vertexData
,
indexData
)
{
function
ifcGeometryToBuffer
(
vertexData
,
indexData
)
{
var
geometry
=
new
BufferGeometry
();
var
buffer32
=
new
InterleavedBuffer
(
vertexData
,
6
);
var
buffer32
=
new
InterleavedBuffer
(
vertexData
,
6
);
geometry
.
setAttribute
(
"
position
"
,
new
InterleavedBufferAttribute
(
buffer32
,
3
,
0
)
'
position
'
,
new
InterleavedBufferAttribute
(
buffer32
,
3
,
0
)
);
geometry
.
setAttribute
(
"
normal
"
,
new
InterleavedBufferAttribute
(
buffer32
,
3
,
3
)
'
normal
'
,
new
InterleavedBufferAttribute
(
buffer32
,
3
,
3
)
);
geometry
.
setIndex
(
new
BufferAttribute
(
indexData
,
1
)
);
geometry
.
setIndex
(
new
BufferAttribute
(
indexData
,
1
)
);
return
geometry
;
}
};
})(),
});
}
)(),
}
);
export
{
IFCLoader
};
examples/webgl_loader_ifc.html
浏览文件 @
02f4dff0
...
...
@@ -15,74 +15,76 @@
<div
id=
"info"
>
<a
href=
"https://threejs.org"
target=
"_blank"
rel=
"noopener"
>
three.js
</a>
-
<a
href=
"https://www.buildingsmart.org/standards/bsi-standards/industry-foundation-classes/"
target=
"_blank"
rel=
"noopener"
>
IFC
</a
>
<a
href=
"https://www.buildingsmart.org/standards/bsi-standards/industry-foundation-classes/"
target=
"_blank"
rel=
"noopener"
>
IFC
</a>
loader
</div>
<script
type=
"module"
>
import
*
as
THREE
from
"
../build/three.module.js
"
;
import
{
OrbitControls
}
from
"
./jsm/controls/OrbitControls.js
"
;
import
{
IFCLoader
}
from
"
./jsm/loaders/ifc/IFCLoader.js
"
;
import
*
as
THREE
from
'
../build/three.module.js
'
;
import
{
OrbitControls
}
from
'
./jsm/controls/OrbitControls.js
'
;
import
{
IFCLoader
}
from
'
./jsm/loaders/IFCLoader.js
'
;
//Scene
const
scene
=
new
THREE
.
Scene
();
scene
.
background
=
new
THREE
.
Color
(
0x8cc7de
);
scene
.
background
=
new
THREE
.
Color
(
0x8cc7de
);
//Renderer
const
container
=
document
.
querySelector
(
'
#container
'
);
const
renderer
=
new
THREE
.
WebGLRenderer
({
antialias
:
true
});
renderer
.
setSize
(
window
.
innerWidth
,
window
.
innerHeight
);
renderer
.
setPixelRatio
(
Math
.
min
(
window
.
devicePixelRatio
,
2
));
const
renderer
=
new
THREE
.
WebGLRenderer
(
{
antialias
:
true
}
);
renderer
.
setSize
(
window
.
innerWidth
,
window
.
innerHeight
);
renderer
.
setPixelRatio
(
Math
.
min
(
window
.
devicePixelRatio
,
2
)
);
renderer
.
setAnimationLoop
(
animation
);
container
.
appendChild
(
renderer
.
domElement
);
//Camera
const
camera
=
new
THREE
.
PerspectiveCamera
(
45
,
window
.
innerWidth
/
window
.
innerHeight
,
0.1
,
1000
);
camera
.
position
.
z
=
-
70
;
const
camera
=
new
THREE
.
PerspectiveCamera
(
45
,
window
.
innerWidth
/
window
.
innerHeight
,
0.1
,
1000
);
camera
.
position
.
z
=
-
70
;
camera
.
position
.
y
=
25
;
camera
.
position
.
x
=
90
;
camera
.
lookAt
(
0
,
0
,
0
);
let
controls
=
new
OrbitControls
(
camera
,
renderer
.
domElement
);
camera
.
lookAt
(
0
,
0
,
0
);
const
controls
=
new
OrbitControls
(
camera
,
renderer
.
domElement
);
//Initial cube
const
geometry
=
new
THREE
.
BoxGeometry
();
const
material
=
new
THREE
.
MeshPhongMaterial
(
{
color
:
0xffffff
}
);
const
cube
=
new
THREE
.
Mesh
(
geometry
,
material
);
scene
.
add
(
cube
);
const
material
=
new
THREE
.
MeshPhongMaterial
(
{
color
:
0xffffff
}
);
const
cube
=
new
THREE
.
Mesh
(
geometry
,
material
);
scene
.
add
(
cube
);
//Lights
const
directionalLight1
=
new
THREE
.
DirectionalLight
(
0xffeeff
,
0.8
);
directionalLight1
.
position
.
set
(
1
,
1
,
1
);
scene
.
add
(
directionalLight1
);
const
directionalLight2
=
new
THREE
.
DirectionalLight
(
0xffffff
,
0.8
);
directionalLight2
.
position
.
set
(
-
1
,
0.5
,
-
1
);
scene
.
add
(
directionalLight2
);
const
ambientLight
=
new
THREE
.
AmbientLight
(
0xffffee
,
0.25
);
scene
.
add
(
ambientLight
);
const
directionalLight1
=
new
THREE
.
DirectionalLight
(
0xffeeff
,
0.8
);
directionalLight1
.
position
.
set
(
1
,
1
,
1
);
scene
.
add
(
directionalLight1
);
const
directionalLight2
=
new
THREE
.
DirectionalLight
(
0xffffff
,
0.8
);
directionalLight2
.
position
.
set
(
-
1
,
0.5
,
-
1
);
scene
.
add
(
directionalLight2
);
const
ambientLight
=
new
THREE
.
AmbientLight
(
0xffffee
,
0.25
);
scene
.
add
(
ambientLight
);
//Window resize support
window
.
addEventListener
(
"
resize
"
,
()
=>
{
window
.
addEventListener
(
'
resize
'
,
()
=>
{
camera
.
aspect
=
window
.
innerWidth
/
window
.
innerHeight
;
camera
.
updateProjectionMatrix
();
renderer
.
setSize
(
window
.
innerWidth
,
window
.
innerHeight
);
});
renderer
.
setSize
(
window
.
innerWidth
,
window
.
innerHeight
);
}
);
//Setup IFC Loader
const
ifcLoader
=
new
IFCLoader
();
//Load IFC file
ifcLoader
.
load
(
'
models/ifc/rac_advanced_sample_project.ifc
'
,
(
geometry
)
=>
scene
.
add
(
geometry
)
);
ifcLoader
.
load
(
'
models/ifc/rac_advanced_sample_project.ifc
'
,
(
geometry
)
=>
scene
.
add
(
geometry
)
);
//Animation
function
AnimationLoop
()
{
requestAnimationFrame
(
AnimationLoop
);
function
animation
()
{
controls
.
update
();
renderer
.
render
(
scene
,
camera
);
renderer
.
render
(
scene
,
camera
);
}
AnimationLoop
();
</script>
</body>
</html>
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录