Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Ablesons
three.js
提交
1b6688b6
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,发现更多精彩内容 >>
未验证
提交
1b6688b6
编写于
4月 12, 2018
作者:
M
Mr.doob
提交者:
GitHub
4月 12, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #13783 from takahirox/GLTFLoaderMorph
GLTFLoader: Update morph, non-set unnecessary morph
上级
1ada9849
a78c3e9d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
72 addition
and
57 deletion
+72
-57
examples/js/loaders/GLTFLoader.js
examples/js/loaders/GLTFLoader.js
+72
-57
未找到文件。
examples/js/loaders/GLTFLoader.js
浏览文件 @
1b6688b6
...
...
@@ -1139,103 +1139,114 @@ THREE.GLTFLoader = ( function () {
function
addMorphTargets
(
mesh
,
meshDef
,
primitiveDef
,
accessors
)
{
var
geometry
=
mesh
.
geometry
;
var
material
=
mesh
.
material
;
var
targets
=
primitiveDef
.
targets
;
var
morphAttributes
=
geometry
.
morphAttributes
;
morphAttributes
.
position
=
[];
morphAttributes
.
normal
=
[];
var
hasMorphPosition
=
false
;
var
hasMorphNormal
=
false
;
for
(
var
i
=
0
,
il
=
targets
.
length
;
i
<
il
;
i
++
)
{
var
target
=
targets
[
i
];
if
(
target
.
POSITION
!==
undefined
)
hasMorphPosition
=
true
;
if
(
target
.
NORMAL
!==
undefined
)
hasMorphNormal
=
true
;
if
(
hasMorphPosition
&&
hasMorphNormal
)
break
;
material
.
morphTargets
=
true
;
}
if
(
!
hasMorphPosition
&&
!
hasMorphNormal
)
return
;
var
morphPositions
=
[];
var
morphNormals
=
[];
for
(
var
i
=
0
,
il
=
targets
.
length
;
i
<
il
;
i
++
)
{
var
target
=
targets
[
i
];
var
attributeName
=
'
morphTarget
'
+
i
;
var
positionAttribute
,
normalAttribute
;
if
(
target
.
POSITION
!==
undefined
)
{
if
(
hasMorphPosition
)
{
// Three.js morph formula is
//
p
osition
// + weight0 * ( morph
Target0 - p
osition )
// + weight1 * ( morph
Target1 - p
osition )
// Three.js morph
position is absolute value. The
formula is
//
baseP
osition
// + weight0 * ( morph
Position0 - baseP
osition )
// + weight1 * ( morph
Position1 - baseP
osition )
// ...
// while the glTF one is
//
p
osition
// + weight0 *
morphTarget
0
// + weight1 *
morphTarget
1
// while the glTF one is
relative
//
baseP
osition
// + weight0 *
glTFmorphPosition
0
// + weight1 *
glTFmorphPosition
1
// ...
// then adding position to morphTarget.
// So morphTarget value will depend on mesh's position, then cloning attribute
// for the case if attribute is shared among two or more meshes.
// then we need to convert from relative to absolute here.
positionAttribute
=
cloneBufferAttribute
(
accessors
[
target
.
POSITION
]
);
var
position
=
geometry
.
attributes
.
position
;
if
(
target
.
POSITION
!==
undefined
)
{
for
(
var
j
=
0
,
jl
=
positionAttribute
.
count
;
j
<
jl
;
j
++
)
{
// Cloning not to pollute original accessor
var
positionAttribute
=
cloneBufferAttribute
(
accessors
[
target
.
POSITION
]
);
positionAttribute
.
name
=
attributeName
;
positionAttribute
.
setXYZ
(
j
,
positionAttribute
.
getX
(
j
)
+
position
.
getX
(
j
),
positionAttribute
.
getY
(
j
)
+
position
.
getY
(
j
),
positionAttribute
.
getZ
(
j
)
+
position
.
getZ
(
j
)
);
var
position
=
geometry
.
attributes
.
position
;
}
for
(
var
j
=
0
,
jl
=
positionAttribute
.
count
;
j
<
jl
;
j
++
)
{
}
else
if
(
geometry
.
attributes
.
position
)
{
positionAttribute
.
setXYZ
(
j
,
positionAttribute
.
getX
(
j
)
+
position
.
getX
(
j
),
positionAttribute
.
getY
(
j
)
+
position
.
getY
(
j
),
positionAttribute
.
getZ
(
j
)
+
position
.
getZ
(
j
)
);
// Copying the original position not to affect the final position.
// See the formula above.
positionAttribute
=
cloneBufferAttribute
(
geometry
.
attributes
.
position
);
}
}
}
else
{
positionAttribute
=
geometry
.
attributes
.
position
;
if
(
positionAttribute
!==
undefined
)
{
}
positionAttribute
.
name
=
attributeName
;
morphAttributes
.
position
.
push
(
positionAttribute
);
morphPositions
.
push
(
positionAttribute
);
}
if
(
target
.
NORMAL
!==
undefined
)
{
material
.
morphNormals
=
true
;
if
(
hasMorphNormal
)
{
// see target.POSITION's comment
normalAttribute
=
cloneBufferAttribute
(
accessors
[
target
.
NORMAL
]
);
var
normal
=
geometry
.
attributes
.
normal
;
var
normalAttribute
;
for
(
var
j
=
0
,
jl
=
normalAttribute
.
count
;
j
<
jl
;
j
++
)
{
if
(
target
.
NORMAL
!==
undefined
)
{
normalAttribute
.
setXYZ
(
j
,
normalAttribute
.
getX
(
j
)
+
normal
.
getX
(
j
),
normalAttribute
.
getY
(
j
)
+
normal
.
getY
(
j
),
normalAttribute
.
getZ
(
j
)
+
normal
.
getZ
(
j
)
);
var
normalAttribute
=
cloneBufferAttribute
(
accessors
[
target
.
NORMAL
]
);
normalAttribute
.
name
=
attributeName
;
}
var
normal
=
geometry
.
attributes
.
normal
;
}
else
if
(
geometry
.
attributes
.
normal
!==
undefined
)
{
for
(
var
j
=
0
,
jl
=
normalAttribute
.
count
;
j
<
jl
;
j
++
)
{
normalAttribute
=
cloneBufferAttribute
(
geometry
.
attributes
.
normal
);
normalAttribute
.
setXYZ
(
j
,
normalAttribute
.
getX
(
j
)
+
normal
.
getX
(
j
),
normalAttribute
.
getY
(
j
)
+
normal
.
getY
(
j
),
normalAttribute
.
getZ
(
j
)
+
normal
.
getZ
(
j
)
);
}
}
if
(
normalAttribute
!==
undefined
)
{
}
else
{
normalAttribute
=
geometry
.
attributes
.
normal
;
}
normalAttribute
.
name
=
attributeName
;
morphAttributes
.
normal
.
push
(
normalAttribute
);
morphNormals
.
push
(
normalAttribute
);
}
}
if
(
hasMorphPosition
)
geometry
.
morphAttributes
.
position
=
morphPositions
;
if
(
hasMorphNormal
)
geometry
.
morphAttributes
.
normal
=
morphNormals
;
mesh
.
updateMorphTargets
();
if
(
meshDef
.
weights
!==
undefined
)
{
...
...
@@ -2322,6 +2333,10 @@ THREE.GLTFLoader = ( function () {
addMorphTargets
(
mesh
,
meshDef
,
primitive
,
dependencies
.
accessors
);
material
.
morphTargets
=
true
;
if
(
mesh
.
geometry
.
morphAttributes
.
normal
!==
undefined
)
material
.
morphNormals
=
true
;
}
if
(
meshDef
.
extras
!==
undefined
)
mesh
.
userData
=
meshDef
.
extras
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录