Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Ablesons
three.js
提交
d386d655
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 搜索 >>
未验证
提交
d386d655
编写于
10月 29, 2019
作者:
M
Mr.doob
提交者:
GitHub
10月 29, 2019
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #17830 from Mugen87/dev38
PCDLoader: Add support for binary-compressed files.
上级
bc949fd0
a84496e0
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
196 addition
and
10 deletion
+196
-10
docs/examples/en/loaders/PCDLoader.html
docs/examples/en/loaders/PCDLoader.html
+1
-1
docs/examples/zh/loaders/PCDLoader.html
docs/examples/zh/loaders/PCDLoader.html
+1
-1
examples/js/loaders/PCDLoader.js
examples/js/loaders/PCDLoader.js
+97
-4
examples/jsm/loaders/PCDLoader.js
examples/jsm/loaders/PCDLoader.js
+97
-4
examples/models/pcd/binary_compressed/pcl_logo.pcd
examples/models/pcd/binary_compressed/pcl_logo.pcd
+0
-0
未找到文件。
docs/examples/en/loaders/PCDLoader.html
浏览文件 @
d386d655
...
...
@@ -14,7 +14,7 @@
<p
class=
"desc"
>
A loader for loading a
<em>
.pcd
</em>
resource.
<br
/>
Point Cloud Data is a file format for
<a
href=
"https://en.wikipedia.org/wiki/Point_Cloud_Library"
>
Point Cloud Library
</a>
.
<br
/>
Loader support ascii and
binary. Compressed binary files are not supported
.
Loader support ascii and
(compressed) binary
.
</p>
<h2>
Example
</h2>
...
...
docs/examples/zh/loaders/PCDLoader.html
浏览文件 @
d386d655
...
...
@@ -14,7 +14,7 @@
<p
class=
"desc"
>
A loader for loading a
<em>
.pcd
</em>
resource.
<br
/>
Point Cloud Data is a file format for
<a
href=
"https://en.wikipedia.org/wiki/Point_Cloud_Library"
>
Point Cloud Library
</a>
.
<br
/>
Loader support ascii and
binary. Compressed binary files are not supported
.
Loader support ascii and
(compressed) binary
.
</p>
<h2>
Example
</h2>
...
...
examples/js/loaders/PCDLoader.js
浏览文件 @
d386d655
...
...
@@ -54,6 +54,60 @@ THREE.PCDLoader.prototype = Object.assign( Object.create( THREE.Loader.prototype
parse
:
function
(
data
,
url
)
{
// from https://gitlab.com/taketwo/three-pcd-loader/blob/master/decompress-lzf.js
function
decompressLZF
(
inData
,
outLength
)
{
var
inLength
=
inData
.
length
;
var
outData
=
new
Uint8Array
(
outLength
);
var
inPtr
=
0
;
var
outPtr
=
0
;
var
ctrl
;
var
len
;
var
ref
;
do
{
ctrl
=
inData
[
inPtr
++
];
if
(
ctrl
<
(
1
<<
5
)
)
{
ctrl
++
;
if
(
outPtr
+
ctrl
>
outLength
)
throw
new
Error
(
'
Output buffer is not large enough
'
);
if
(
inPtr
+
ctrl
>
inLength
)
throw
new
Error
(
'
Invalid compressed data
'
);
do
{
outData
[
outPtr
++
]
=
inData
[
inPtr
++
];
}
while
(
--
ctrl
);
}
else
{
len
=
ctrl
>>
5
;
ref
=
outPtr
-
(
(
ctrl
&
0x1f
)
<<
8
)
-
1
;
if
(
inPtr
>=
inLength
)
throw
new
Error
(
'
Invalid compressed data
'
);
if
(
len
===
7
)
{
len
+=
inData
[
inPtr
++
];
if
(
inPtr
>=
inLength
)
throw
new
Error
(
'
Invalid compressed data
'
);
}
ref
-=
inData
[
inPtr
++
];
if
(
outPtr
+
len
+
2
>
outLength
)
throw
new
Error
(
'
Output buffer is not large enough
'
);
if
(
ref
<
0
)
throw
new
Error
(
'
Invalid compressed data
'
);
if
(
ref
>=
outPtr
)
throw
new
Error
(
'
Invalid compressed data
'
);
do
{
outData
[
outPtr
++
]
=
outData
[
ref
++
];
}
while
(
--
len
+
2
);
}
}
while
(
inPtr
<
inLength
);
return
outData
;
}
function
parseHeader
(
data
)
{
var
PCDheader
=
{};
...
...
@@ -219,15 +273,54 @@ THREE.PCDLoader.prototype = Object.assign( Object.create( THREE.Loader.prototype
}
// binary
// binary-compressed
// normally data in PCD files are organized as array of structures: XYZRGBXYZRGB
// binary compressed PCD files organize their data as structure of arrays: XXYYZZRGBRGB
// that requires a totally different parsing approach compared to non-compressed data
if
(
PCDheader
.
data
===
'
binary_compressed
'
)
{
console
.
error
(
'
THREE.PCDLoader: binary_compressed files are not supported
'
);
return
;
var
sizes
=
new
Uint32Array
(
data
.
slice
(
PCDheader
.
headerLen
,
PCDheader
.
headerLen
+
8
)
);
var
compressedSize
=
sizes
[
0
];
var
decompressedSize
=
sizes
[
1
];
var
decompressed
=
decompressLZF
(
new
Uint8Array
(
data
,
PCDheader
.
headerLen
+
8
,
compressedSize
),
decompressedSize
);
var
dataview
=
new
DataView
(
decompressed
.
buffer
);
var
offset
=
PCDheader
.
offset
;
for
(
var
i
=
0
;
i
<
PCDheader
.
points
;
i
++
)
{
if
(
offset
.
x
!==
undefined
)
{
position
.
push
(
dataview
.
getFloat32
(
(
PCDheader
.
points
*
offset
.
x
)
+
PCDheader
.
size
[
0
]
*
i
,
this
.
littleEndian
)
);
position
.
push
(
dataview
.
getFloat32
(
(
PCDheader
.
points
*
offset
.
y
)
+
PCDheader
.
size
[
1
]
*
i
,
this
.
littleEndian
)
);
position
.
push
(
dataview
.
getFloat32
(
(
PCDheader
.
points
*
offset
.
z
)
+
PCDheader
.
size
[
2
]
*
i
,
this
.
littleEndian
)
);
}
if
(
offset
.
rgb
!==
undefined
)
{
color
.
push
(
dataview
.
getUint8
(
(
PCDheader
.
points
*
(
offset
.
rgb
+
2
)
+
PCDheader
.
size
[
3
]
*
i
)
/
255.0
)
);
color
.
push
(
dataview
.
getUint8
(
(
PCDheader
.
points
*
(
offset
.
rgb
+
1
)
+
PCDheader
.
size
[
3
]
*
i
)
/
255.0
)
);
color
.
push
(
dataview
.
getUint8
(
(
PCDheader
.
points
*
(
offset
.
rgb
+
0
)
+
PCDheader
.
size
[
3
]
*
i
)
/
255.0
)
);
}
if
(
offset
.
normal_x
!==
undefined
)
{
normal
.
push
(
dataview
.
getFloat32
(
(
PCDheader
.
points
*
offset
.
normal_x
)
+
PCDheader
.
size
[
4
]
*
i
,
this
.
littleEndian
)
);
normal
.
push
(
dataview
.
getFloat32
(
(
PCDheader
.
points
*
offset
.
normal_y
)
+
PCDheader
.
size
[
5
]
*
i
,
this
.
littleEndian
)
);
normal
.
push
(
dataview
.
getFloat32
(
(
PCDheader
.
points
*
offset
.
normal_z
)
+
PCDheader
.
size
[
6
]
*
i
,
this
.
littleEndian
)
);
}
}
}
// binary
if
(
PCDheader
.
data
===
'
binary
'
)
{
var
dataview
=
new
DataView
(
data
,
PCDheader
.
headerLen
);
...
...
@@ -287,7 +380,7 @@ THREE.PCDLoader.prototype = Object.assign( Object.create( THREE.Loader.prototype
}
// build
mesh
// build
point cloud
var
mesh
=
new
THREE
.
Points
(
geometry
,
material
);
var
name
=
url
.
split
(
''
).
reverse
().
join
(
''
);
...
...
examples/jsm/loaders/PCDLoader.js
浏览文件 @
d386d655
...
...
@@ -65,6 +65,60 @@ PCDLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
parse
:
function
(
data
,
url
)
{
// from https://gitlab.com/taketwo/three-pcd-loader/blob/master/decompress-lzf.js
function
decompressLZF
(
inData
,
outLength
)
{
var
inLength
=
inData
.
length
;
var
outData
=
new
Uint8Array
(
outLength
);
var
inPtr
=
0
;
var
outPtr
=
0
;
var
ctrl
;
var
len
;
var
ref
;
do
{
ctrl
=
inData
[
inPtr
++
];
if
(
ctrl
<
(
1
<<
5
)
)
{
ctrl
++
;
if
(
outPtr
+
ctrl
>
outLength
)
throw
new
Error
(
'
Output buffer is not large enough
'
);
if
(
inPtr
+
ctrl
>
inLength
)
throw
new
Error
(
'
Invalid compressed data
'
);
do
{
outData
[
outPtr
++
]
=
inData
[
inPtr
++
];
}
while
(
--
ctrl
);
}
else
{
len
=
ctrl
>>
5
;
ref
=
outPtr
-
(
(
ctrl
&
0x1f
)
<<
8
)
-
1
;
if
(
inPtr
>=
inLength
)
throw
new
Error
(
'
Invalid compressed data
'
);
if
(
len
===
7
)
{
len
+=
inData
[
inPtr
++
];
if
(
inPtr
>=
inLength
)
throw
new
Error
(
'
Invalid compressed data
'
);
}
ref
-=
inData
[
inPtr
++
];
if
(
outPtr
+
len
+
2
>
outLength
)
throw
new
Error
(
'
Output buffer is not large enough
'
);
if
(
ref
<
0
)
throw
new
Error
(
'
Invalid compressed data
'
);
if
(
ref
>=
outPtr
)
throw
new
Error
(
'
Invalid compressed data
'
);
do
{
outData
[
outPtr
++
]
=
outData
[
ref
++
];
}
while
(
--
len
+
2
);
}
}
while
(
inPtr
<
inLength
);
return
outData
;
}
function
parseHeader
(
data
)
{
var
PCDheader
=
{};
...
...
@@ -230,15 +284,54 @@ PCDLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
}
// binary
// binary-compressed
// normally data in PCD files are organized as array of structures: XYZRGBXYZRGB
// binary compressed PCD files organize their data as structure of arrays: XXYYZZRGBRGB
// that requires a totally different parsing approach compared to non-compressed data
if
(
PCDheader
.
data
===
'
binary_compressed
'
)
{
console
.
error
(
'
THREE.PCDLoader: binary_compressed files are not supported
'
);
return
;
var
sizes
=
new
Uint32Array
(
data
.
slice
(
PCDheader
.
headerLen
,
PCDheader
.
headerLen
+
8
)
);
var
compressedSize
=
sizes
[
0
];
var
decompressedSize
=
sizes
[
1
];
var
decompressed
=
decompressLZF
(
new
Uint8Array
(
data
,
PCDheader
.
headerLen
+
8
,
compressedSize
),
decompressedSize
);
var
dataview
=
new
DataView
(
decompressed
.
buffer
);
var
offset
=
PCDheader
.
offset
;
for
(
var
i
=
0
;
i
<
PCDheader
.
points
;
i
++
)
{
if
(
offset
.
x
!==
undefined
)
{
position
.
push
(
dataview
.
getFloat32
(
(
PCDheader
.
points
*
offset
.
x
)
+
PCDheader
.
size
[
0
]
*
i
,
this
.
littleEndian
)
);
position
.
push
(
dataview
.
getFloat32
(
(
PCDheader
.
points
*
offset
.
y
)
+
PCDheader
.
size
[
1
]
*
i
,
this
.
littleEndian
)
);
position
.
push
(
dataview
.
getFloat32
(
(
PCDheader
.
points
*
offset
.
z
)
+
PCDheader
.
size
[
2
]
*
i
,
this
.
littleEndian
)
);
}
if
(
offset
.
rgb
!==
undefined
)
{
color
.
push
(
dataview
.
getUint8
(
(
PCDheader
.
points
*
(
offset
.
rgb
+
2
)
+
PCDheader
.
size
[
3
]
*
i
)
/
255.0
)
);
color
.
push
(
dataview
.
getUint8
(
(
PCDheader
.
points
*
(
offset
.
rgb
+
1
)
+
PCDheader
.
size
[
3
]
*
i
)
/
255.0
)
);
color
.
push
(
dataview
.
getUint8
(
(
PCDheader
.
points
*
(
offset
.
rgb
+
0
)
+
PCDheader
.
size
[
3
]
*
i
)
/
255.0
)
);
}
if
(
offset
.
normal_x
!==
undefined
)
{
normal
.
push
(
dataview
.
getFloat32
(
(
PCDheader
.
points
*
offset
.
normal_x
)
+
PCDheader
.
size
[
4
]
*
i
,
this
.
littleEndian
)
);
normal
.
push
(
dataview
.
getFloat32
(
(
PCDheader
.
points
*
offset
.
normal_y
)
+
PCDheader
.
size
[
5
]
*
i
,
this
.
littleEndian
)
);
normal
.
push
(
dataview
.
getFloat32
(
(
PCDheader
.
points
*
offset
.
normal_z
)
+
PCDheader
.
size
[
6
]
*
i
,
this
.
littleEndian
)
);
}
}
}
// binary
if
(
PCDheader
.
data
===
'
binary
'
)
{
var
dataview
=
new
DataView
(
data
,
PCDheader
.
headerLen
);
...
...
@@ -298,7 +391,7 @@ PCDLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
}
// build
mesh
// build
point cloud
var
mesh
=
new
Points
(
geometry
,
material
);
var
name
=
url
.
split
(
''
).
reverse
().
join
(
''
);
...
...
examples/models/pcd/binary_compressed/pcl_logo.pcd
0 → 100644
浏览文件 @
d386d655
文件已添加
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录