Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
车家大少爷
three.js
提交
5d159430
T
three.js
项目概览
车家大少爷
/
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,发现更多精彩内容 >>
提交
5d159430
编写于
3月 17, 2018
作者:
M
Mr.doob
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Added basic functionality to SVGLoader.
上级
bf2118f8
变更
4
展开全部
显示空白变更内容
内联
并排
Showing
4 changed file
with
1077 addition
and
6 deletion
+1077
-6
examples/files.js
examples/files.js
+1
-0
examples/js/loaders/SVGLoader.js
examples/js/loaders/SVGLoader.js
+188
-6
examples/models/svg/tiger.svg
examples/models/svg/tiger.svg
+730
-0
examples/webgl_loader_svg.html
examples/webgl_loader_svg.html
+158
-0
未找到文件。
examples/files.js
浏览文件 @
5d159430
...
...
@@ -124,6 +124,7 @@ var files = {
"
webgl_loader_sea3d_skinning
"
,
"
webgl_loader_sea3d_sound
"
,
"
webgl_loader_stl
"
,
"
webgl_loader_svg
"
,
"
webgl_loader_texture_dds
"
,
"
webgl_loader_texture_exr
"
,
"
webgl_loader_texture_hdr
"
,
...
...
examples/js/loaders/SVGLoader.js
浏览文件 @
5d159430
...
...
@@ -17,17 +17,199 @@ THREE.SVGLoader.prototype = {
var
scope
=
this
;
var
parser
=
new
DOMParser
();
var
loader
=
new
THREE
.
FileLoader
(
scope
.
manager
);
loader
.
load
(
url
,
function
(
svgString
)
{
var
doc
=
parser
.
parseFromString
(
svgString
,
'
image/svg+xml
'
);
// application/xml
loader
.
load
(
url
,
function
(
text
)
{
onLoad
(
doc
.
documentElement
);
onLoad
(
scope
.
parse
(
text
)
);
},
onProgress
,
onError
);
},
parse
:
function
(
text
)
{
function
parseNodes
(
nodes
)
{
for
(
var
i
=
0
;
i
<
nodes
.
length
;
i
++
)
{
parseNode
(
nodes
[
i
]
);
}
}
function
parseNode
(
node
)
{
if
(
node
.
nodeType
!==
1
)
return
;
switch
(
node
.
nodeName
)
{
case
'
svg
'
:
break
;
case
'
g
'
:
break
;
case
'
path
'
:
paths
.
push
(
parsePathNode
(
node
)
);
break
;
case
'
rect
'
:
paths
.
push
(
parseRectNode
(
node
)
);
break
;
default
:
console
.
log
(
node
);
break
;
}
parseNodes
(
node
.
childNodes
);
}
function
parsePathNode
(
node
)
{
var
path
=
new
THREE
.
ShapePath
();
var
point
=
new
THREE
.
Vector2
();
var
d
=
node
.
getAttribute
(
'
d
'
);
console
.
log
(
d
);
var
commands
=
d
.
match
(
/
[
a-df-z
][^
a-df-z
]
*/ig
);
for
(
var
i
=
0
;
i
<
commands
.
length
;
i
++
)
{
var
command
=
commands
[
i
];
var
type
=
command
.
charAt
(
0
);
var
data
=
command
.
substr
(
1
);
switch
(
type
)
{
case
'
M
'
:
var
numbers
=
parseFloats
(
data
);
point
.
fromArray
(
numbers
);
path
.
moveTo
(
point
.
x
,
point
.
y
);
break
;
case
'
H
'
:
var
numbers
=
parseFloats
(
data
);
point
.
x
=
numbers
[
0
];
path
.
lineTo
(
point
.
x
,
point
.
y
);
break
;
case
'
V
'
:
var
numbers
=
parseFloats
(
data
);
point
.
y
=
numbers
[
0
];
path
.
lineTo
(
point
.
x
,
point
.
y
);
break
;
case
'
L
'
:
var
numbers
=
parseFloats
(
data
);
point
.
x
=
numbers
[
0
];
point
.
y
=
numbers
[
1
];
path
.
lineTo
(
point
.
x
,
point
.
y
);
break
;
case
'
C
'
:
var
numbers
=
parseFloats
(
data
);
path
.
bezierCurveTo
(
numbers
[
0
],
numbers
[
1
],
numbers
[
2
],
numbers
[
3
],
numbers
[
4
],
numbers
[
5
],
);
point
.
x
=
numbers
[
4
];
point
.
y
=
numbers
[
5
];
break
;
case
'
h
'
:
var
numbers
=
parseFloats
(
data
);
point
.
x
+=
numbers
[
0
];
path
.
lineTo
(
point
.
x
,
point
.
y
);
break
;
case
'
v
'
:
var
numbers
=
parseFloats
(
data
);
point
.
y
+=
numbers
[
0
];
path
.
lineTo
(
point
.
x
,
point
.
y
);
break
;
case
'
l
'
:
var
numbers
=
parseFloats
(
data
);
point
.
x
+=
numbers
[
0
];
point
.
y
+=
numbers
[
1
];
path
.
lineTo
(
point
.
x
,
point
.
y
);
break
;
case
'
c
'
:
var
numbers
=
parseFloats
(
data
);
path
.
bezierCurveTo
(
point
.
x
+
numbers
[
0
],
point
.
y
+
numbers
[
1
],
point
.
x
+
numbers
[
2
],
point
.
y
+
numbers
[
3
],
point
.
x
+
numbers
[
4
],
point
.
y
+
numbers
[
5
],
);
point
.
x
+=
numbers
[
4
];
point
.
y
+=
numbers
[
5
];
break
;
}
}
return
path
;
}
function
parseRectNode
(
node
)
{
var
x
=
parseFloat
(
node
.
getAttribute
(
'
x
'
)
);
var
y
=
parseFloat
(
node
.
getAttribute
(
'
y
'
)
);
var
w
=
parseFloat
(
node
.
getAttribute
(
'
width
'
)
);
var
h
=
parseFloat
(
node
.
getAttribute
(
'
height
'
)
);
var
path
=
new
THREE
.
ShapePath
();
path
.
moveTo
(
x
,
y
);
path
.
lineTo
(
x
+
w
,
y
);
path
.
lineTo
(
x
+
w
,
y
+
h
);
path
.
lineTo
(
x
,
y
+
h
);
return
path
;
}
function
parseFloats
(
string
)
{
var
array
=
string
.
split
(
/
[\s
,
]
+|
(?=\s?[
+
\-])
/
);
for
(
var
i
=
0
;
i
<
array
.
length
;
i
++
)
{
array
[
i
]
=
parseFloat
(
array
[
i
]
);
}
return
array
;
}
//
var
xml
=
new
DOMParser
().
parseFromString
(
text
,
'
image/svg+xml
'
);
// application/xml
var
svg
=
xml
.
documentElement
;
var
paths
=
[];
parseNode
(
svg
);
return
paths
;
}
};
examples/models/svg/tiger.svg
0 → 100644
浏览文件 @
5d159430
此差异已折叠。
点击以展开。
examples/webgl_loader_svg.html
0 → 100644
浏览文件 @
5d159430
<!DOCTYPE html>
<html
lang=
"en"
>
<head>
<title>
three.js webgl
</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
{
color
:
#ffffff
;
font-family
:
Monospace
;
font-size
:
13px
;
text-align
:
center
;
font-weight
:
bold
;
background-color
:
#000000
;
margin
:
0px
;
overflow
:
hidden
;
}
#info
{
position
:
absolute
;
top
:
0px
;
width
:
100%
;
padding
:
5px
;
}
a
{
color
:
#ffffff
;
}
</style>
</head>
<body>
<div
id=
"container"
></div>
<div
id=
"info"
>
<a
href=
"http://threejs.org"
target=
"_blank"
rel=
"noopener"
>
three.js
</a>
</div>
<script
type=
"text/javascript"
src=
"../build/three.js"
></script>
<script
src=
"js/controls/OrbitControls.js"
></script>
<script
src=
"js/loaders/SVGLoader.js"
></script>
<script
src=
"js/libs/stats.min.js"
></script>
<script>
var
renderer
,
stats
,
scene
,
camera
;
init
();
animate
();
//
function
init
()
{
var
container
=
document
.
getElementById
(
'
container
'
);
//
scene
=
new
THREE
.
Scene
();
scene
.
background
=
new
THREE
.
Color
(
0xb0b0b0
);
//
camera
=
new
THREE
.
PerspectiveCamera
(
50
,
window
.
innerWidth
/
window
.
innerHeight
,
1
,
1000
);
camera
.
position
.
set
(
0
,
0
,
200
);
//
var
helper
=
new
THREE
.
GridHelper
(
160
,
10
);
helper
.
rotation
.
x
=
Math
.
PI
/
2
;
scene
.
add
(
helper
);
//
var
loader
=
new
THREE
.
SVGLoader
();
loader
.
load
(
'
models/svg/tiger.svg
'
,
function
(
paths
)
{
console
.
log
(
paths
);
var
group
=
new
THREE
.
Group
();
group
.
scale
.
multiplyScalar
(
0.1
);
group
.
scale
.
y
*=
-
1
;
for
(
var
i
=
0
;
i
<
paths
.
length
;
i
++
)
{
var
path
=
paths
[
i
];
var
material
=
new
THREE
.
MeshBasicMaterial
(
{
color
:
Math
.
random
()
*
0xffffff
}
);
var
shapes
=
path
.
toShapes
(
true
);
for
(
var
j
=
0
;
j
<
shapes
.
length
;
j
++
)
{
var
shape
=
shapes
[
j
];
var
geometry
=
new
THREE
.
ShapeBufferGeometry
(
shape
);
var
mesh
=
new
THREE
.
Mesh
(
geometry
,
material
);
group
.
add
(
mesh
);
}
}
scene
.
add
(
group
);
}
);
//
renderer
=
new
THREE
.
WebGLRenderer
(
{
antialias
:
true
}
);
renderer
.
setPixelRatio
(
window
.
devicePixelRatio
);
renderer
.
setSize
(
window
.
innerWidth
,
window
.
innerHeight
);
container
.
appendChild
(
renderer
.
domElement
);
//
var
controls
=
new
THREE
.
OrbitControls
(
camera
,
renderer
.
domElement
);
//
stats
=
new
Stats
();
container
.
appendChild
(
stats
.
dom
);
//
window
.
addEventListener
(
'
resize
'
,
onWindowResize
,
false
);
}
function
onWindowResize
()
{
camera
.
aspect
=
window
.
innerWidth
/
window
.
innerHeight
;
camera
.
updateProjectionMatrix
();
renderer
.
setSize
(
window
.
innerWidth
,
window
.
innerHeight
);
}
function
animate
()
{
requestAnimationFrame
(
animate
);
render
();
stats
.
update
();
}
function
render
()
{
renderer
.
render
(
scene
,
camera
);
}
</script>
</body>
</html>
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录