Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
车家大少爷
three.js
提交
492d9368
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,发现更多精彩内容 >>
未验证
提交
492d9368
编写于
8月 03, 2018
作者:
M
Mr.doob
提交者:
GitHub
8月 03, 2018
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #14616 from yomboprime/bufferedBreak
Support BufferGeometry in ConvexObjectBreaker. Fixes #14609
上级
de785e86
d91f89d0
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
112 addition
and
93 deletion
+112
-93
examples/js/ConvexObjectBreaker.js
examples/js/ConvexObjectBreaker.js
+100
-81
examples/webgl_physics_convex_break.html
examples/webgl_physics_convex_break.html
+12
-12
未找到文件。
examples/js/ConvexObjectBreaker.js
浏览文件 @
492d9368
/**
0
/**
* @author yomboprime https://github.com/yomboprime
*
* @fileoverview This class can be used to subdivide a convex Geometry object into pieces.
...
...
@@ -13,14 +13,15 @@
*
* Requisites for the object:
*
* - Mesh object must have a Geometry (not BufferGeometry) and a Material
* - Mesh object must have a BufferGeometry (not Geometry) and a Material
*
* - Vertex normals must be planar (not smoothed)
*
* - The
Geometry must be convex (this is not test
ed in the library). You can create convex
*
Geometries with THREE.ConvexGeometry. The BoxGeometry, Sphere
Geometry and other convex primitives
* - The
geometry must be convex (this is not check
ed in the library). You can create convex
*
geometries with THREE.ConvexBufferGeometry. The BoxBufferGeometry, SphereBuffer
Geometry and other convex primitives
* can also be used.
*
* Note: This lib adds member variables to object's userData member and to its vertices.
* (see prepareBreakableObject function)
* Note: This lib adds member variables to object's userData member (see prepareBreakableObject function)
* Use with caution and read the code when using with other libs.
*
* @param {double} minSizeForBreak Min size a debris can have to break.
...
...
@@ -36,11 +37,19 @@ THREE.ConvexObjectBreaker = function ( minSizeForBreak, smallDelta ) {
this
.
tempLine1
=
new
THREE
.
Line3
();
this
.
tempPlane1
=
new
THREE
.
Plane
();
this
.
tempPlane2
=
new
THREE
.
Plane
();
this
.
tempPlane_Cut
=
new
THREE
.
Plane
();
this
.
tempCM1
=
new
THREE
.
Vector3
();
this
.
tempCM2
=
new
THREE
.
Vector3
();
this
.
tempVector3
=
new
THREE
.
Vector3
();
this
.
tempVector3_2
=
new
THREE
.
Vector3
();
this
.
tempVector3_3
=
new
THREE
.
Vector3
();
this
.
tempVector3_P0
=
new
THREE
.
Vector3
();
this
.
tempVector3_P1
=
new
THREE
.
Vector3
();
this
.
tempVector3_P2
=
new
THREE
.
Vector3
();
this
.
tempVector3_N0
=
new
THREE
.
Vector3
();
this
.
tempVector3_N1
=
new
THREE
.
Vector3
();
this
.
tempVector3_AB
=
new
THREE
.
Vector3
();
this
.
tempVector3_CB
=
new
THREE
.
Vector3
();
this
.
tempResultObjects
=
{
object1
:
null
,
object2
:
null
};
this
.
segments
=
[];
...
...
@@ -55,13 +64,13 @@ THREE.ConvexObjectBreaker.prototype = {
prepareBreakableObject
:
function
(
object
,
mass
,
velocity
,
angularVelocity
,
breakable
)
{
// object is a THREE.Object3d (normally a Mesh), must have a Geometry, and it must be convex.
// object is a THREE.Object3d (normally a Mesh), must have a
Buffer
Geometry, and it must be convex.
// Its material property is propagated to its children (sub-pieces)
// mass must be > 0
// Create vertices mark
var
vertices
=
object
.
geometry
.
vertices
;
for
(
var
i
=
0
,
il
=
vertices
.
length
;
i
<
il
;
i
++
)
vertices
[
i
].
mark
=
0
;
if
(
!
object
.
geometry
.
isBufferGeometry
)
{
console
.
error
(
"
THREE.ConvexObjectBreaker.prepareBreakableObject(): Parameter object must have a BufferGeometry.
"
)
;
}
var
userData
=
object
.
userData
;
userData
.
mass
=
mass
;
...
...
@@ -165,43 +174,65 @@ THREE.ConvexObjectBreaker.prototype = {
// Returned value is number of pieces, 0 for error.
var
geometry
=
object
.
geometry
;
var
points
=
geometry
.
vertices
;
var
faces
=
geometry
.
faces
;
var
numPoints
=
points
.
length
;
var
coords
=
geometry
.
attributes
.
position
.
array
;
var
normals
=
geometry
.
attributes
.
normal
.
array
;
var
numPoints
=
coords
.
length
/
3
;
var
numFaces
=
numPoints
/
3
;
var
indices
=
geometry
.
getIndex
();
if
(
indices
)
{
indices
=
indices
.
array
;
numFaces
=
indices
.
length
/
3
;
}
function
getVertexIndex
(
faceIdx
,
vert
)
{
// vert = 0, 1 or 2.
var
idx
=
faceIdx
*
3
+
vert
;
return
indices
?
indices
[
idx
]
:
idx
;
}
var
points1
=
[];
var
points2
=
[];
var
delta
=
this
.
smallDelta
;
// Reset vertices mark
for
(
var
i
=
0
;
i
<
numPoints
;
i
++
)
points
[
i
].
mark
=
0
;
// Reset segments mark
var
numPointPairs
=
numPoints
*
numPoints
;
for
(
var
i
=
0
;
i
<
numPointPairs
;
i
++
)
this
.
segments
[
i
]
=
false
;
var
p0
=
this
.
tempVector3_P0
;
var
p1
=
this
.
tempVector3_P1
;
var
p2
=
this
.
tempVector3_P2
;
var
n0
=
this
.
tempVector3_N0
;
var
n1
=
this
.
tempVector3_N1
;
// Iterate through the faces to mark edges shared by coplanar faces
for
(
var
i
=
0
,
il
=
faces
.
length
-
1
;
i
<
il
;
i
++
)
{
for
(
var
i
=
0
;
i
<
numFaces
-
1
;
i
++
)
{
var
face1
=
faces
[
i
];
var
a1
=
getVertexIndex
(
i
,
0
);
var
b1
=
getVertexIndex
(
i
,
1
);
var
c1
=
getVertexIndex
(
i
,
2
);
for
(
var
j
=
i
+
1
,
jl
=
faces
.
length
;
j
<
jl
;
j
++
)
{
// Assuming all 3 vertices have the same normal
n0
.
set
(
normals
[
a1
],
normals
[
a1
]
+
1
,
normals
[
a1
]
+
2
);
var
face2
=
faces
[
j
];
for
(
var
j
=
i
+
1
;
j
<
numFaces
;
j
++
)
{
var
coplanar
=
1
-
face1
.
normal
.
dot
(
face2
.
normal
)
<
delta
;
if
(
coplanar
)
{
var
a2
=
getVertexIndex
(
j
,
0
);
var
b2
=
getVertexIndex
(
j
,
1
);
var
c2
=
getVertexIndex
(
j
,
2
);
// Assuming all 3 vertices have the same normal
n1
.
set
(
normals
[
a2
],
normals
[
a2
]
+
1
,
normals
[
a2
]
+
2
);
var
a1
=
face1
.
a
;
var
b1
=
face1
.
b
;
var
c1
=
face1
.
c
;
var
a2
=
face2
.
a
;
var
b2
=
face2
.
b
;
var
c2
=
face2
.
c
;
var
coplanar
=
1
-
n0
.
dot
(
n1
)
<
delta
;
if
(
coplanar
)
{
if
(
a1
===
a2
||
a1
===
b2
||
a1
===
c2
)
{
...
...
@@ -231,19 +262,21 @@ THREE.ConvexObjectBreaker.prototype = {
}
// Transform the plane to object local space
var
localPlane
=
this
.
tempPlane
1
;
var
localPlane
=
this
.
tempPlane
_Cut
;
object
.
updateMatrix
();
THREE
.
ConvexObjectBreaker
.
transformPlaneToLocalSpace
(
plane
,
object
.
matrix
,
localPlane
);
// Iterate through the faces adding points to both pieces
for
(
var
i
=
0
,
il
=
faces
.
length
;
i
<
il
;
i
++
)
{
for
(
var
i
=
0
;
i
<
numFaces
;
i
++
)
{
var
face
=
faces
[
i
];
var
va
=
getVertexIndex
(
i
,
0
);
var
vb
=
getVertexIndex
(
i
,
1
);
var
vc
=
getVertexIndex
(
i
,
2
);
for
(
var
segment
=
0
;
segment
<
3
;
segment
++
)
{
var
i0
=
segment
===
0
?
face
.
a
:
(
segment
===
1
?
face
.
b
:
face
.
c
);
var
i1
=
segment
===
0
?
face
.
b
:
(
segment
===
1
?
face
.
c
:
face
.
a
);
var
i0
=
segment
===
0
?
va
:
(
segment
===
1
?
vb
:
v
c
);
var
i1
=
segment
===
0
?
vb
:
(
segment
===
1
?
vc
:
v
a
);
var
segmentState
=
this
.
segments
[
i0
*
numPoints
+
i1
];
...
...
@@ -253,66 +286,55 @@ THREE.ConvexObjectBreaker.prototype = {
this
.
segments
[
i0
*
numPoints
+
i1
]
=
true
;
this
.
segments
[
i1
*
numPoints
+
i0
]
=
true
;
var
p0
=
points
[
i0
];
var
p1
=
points
[
i1
];
if
(
p0
.
mark
===
0
)
{
p0
.
set
(
coords
[
3
*
i0
],
coords
[
3
*
i0
+
1
],
coords
[
3
*
i0
+
2
]
);
p1
.
set
(
coords
[
3
*
i1
],
coords
[
3
*
i1
+
1
],
coords
[
3
*
i1
+
2
]
);
var
d
=
localPlane
.
distanceToPoint
(
p0
);
// mark: 1 for negative side, 2 for positive side, 3 for coplanar point
var
mark0
=
0
;
// mark: 1 for negative side, 2 for positive side, 3 for coplanar point
if
(
d
>
delta
)
{
var
d
=
localPlane
.
distanceToPoint
(
p0
);
p0
.
mark
=
2
;
points2
.
push
(
p0
);
if
(
d
>
delta
)
{
}
else
if
(
d
<
-
delta
)
{
mark0
=
2
;
points2
.
push
(
p0
.
clone
()
);
p0
.
mark
=
1
;
points1
.
push
(
p0
);
}
else
if
(
d
<
-
delta
)
{
}
else
{
mark0
=
1
;
points1
.
push
(
p0
.
clone
()
);
p0
.
mark
=
3
;
points1
.
push
(
p0
);
var
p0_2
=
p0
.
clone
();
p0_2
.
mark
=
3
;
points2
.
push
(
p0_2
);
}
else
{
}
mark0
=
3
;
points1
.
push
(
p0
.
clone
()
);
points2
.
push
(
p0
.
clone
()
);
}
if
(
p1
.
mark
===
0
)
{
// mark: 1 for negative side, 2 for positive side, 3 for coplanar point
var
mark1
=
0
;
var
d
=
localPlane
.
distanceToPoint
(
p1
);
var
d
=
localPlane
.
distanceToPoint
(
p1
);
// mark: 1 for negative side, 2 for positive side, 3 for coplanar point
if
(
d
>
delta
)
{
if
(
d
>
delta
)
{
p1
.
mark
=
2
;
points2
.
push
(
p1
);
mark1
=
2
;
points2
.
push
(
p1
.
clone
()
);
}
else
if
(
d
<
-
delta
)
{
}
else
if
(
d
<
-
delta
)
{
p1
.
mark
=
1
;
points1
.
push
(
p1
);
mark1
=
1
;
points1
.
push
(
p1
.
clone
()
);
}
else
{
}
else
{
p1
.
mark
=
3
;
points1
.
push
(
p1
);
var
p1_2
=
p1
.
clone
();
p1_2
.
mark
=
3
;
points2
.
push
(
p1_2
);
}
mark1
=
3
;
points1
.
push
(
p1
.
clone
()
);
points2
.
push
(
p1
.
clone
()
);
}
var
mark0
=
p0
.
mark
;
var
mark1
=
p1
.
mark
;
if
(
(
mark0
===
1
&&
mark1
===
2
)
||
(
mark0
===
2
&&
mark1
===
1
)
)
{
// Intersection of segment with the plane
...
...
@@ -333,11 +355,8 @@ THREE.ConvexObjectBreaker.prototype = {
}
intersection
.
mark
=
1
;
points1
.
push
(
intersection
);
var
intersection_2
=
intersection
.
clone
();
intersection_2
.
mark
=
2
;
points2
.
push
(
intersection_2
);
points2
.
push
(
intersection
.
clone
()
);
}
...
...
@@ -395,7 +414,7 @@ THREE.ConvexObjectBreaker.prototype = {
if
(
numPoints1
>
4
)
{
object1
=
new
THREE
.
Mesh
(
new
THREE
.
ConvexGeometry
(
points1
),
object
.
material
);
object1
=
new
THREE
.
Mesh
(
new
THREE
.
Convex
Buffer
Geometry
(
points1
),
object
.
material
);
object1
.
position
.
copy
(
this
.
tempCM1
);
object1
.
quaternion
.
copy
(
object
.
quaternion
);
...
...
@@ -407,7 +426,7 @@ THREE.ConvexObjectBreaker.prototype = {
if
(
numPoints2
>
4
)
{
object2
=
new
THREE
.
Mesh
(
new
THREE
.
ConvexGeometry
(
points2
),
object
.
material
);
object2
=
new
THREE
.
Mesh
(
new
THREE
.
Convex
Buffer
Geometry
(
points2
),
object
.
material
);
object2
.
position
.
copy
(
this
.
tempCM2
);
object2
.
quaternion
.
copy
(
object
.
quaternion
);
...
...
examples/webgl_physics_convex_break.html
浏览文件 @
492d9368
...
...
@@ -184,7 +184,7 @@
function
createObject
(
mass
,
halfExtents
,
pos
,
quat
,
material
)
{
var
object
=
new
THREE
.
Mesh
(
new
THREE
.
BoxGeometry
(
halfExtents
.
x
*
2
,
halfExtents
.
y
*
2
,
halfExtents
.
z
*
2
),
material
);
var
object
=
new
THREE
.
Mesh
(
new
THREE
.
Box
Buffer
Geometry
(
halfExtents
.
x
*
2
,
halfExtents
.
y
*
2
,
halfExtents
.
z
*
2
),
material
);
object
.
position
.
copy
(
pos
);
object
.
quaternion
.
copy
(
quat
);
convexBreaker
.
prepareBreakableObject
(
object
,
mass
,
new
THREE
.
Vector3
(),
new
THREE
.
Vector3
(),
true
);
...
...
@@ -212,19 +212,19 @@
var
towerHalfExtents
=
new
THREE
.
Vector3
(
2
,
5
,
2
);
pos
.
set
(
-
8
,
5
,
0
);
quat
.
set
(
0
,
0
,
0
,
1
);
createObject
(
towerMass
,
towerHalfExtents
,
pos
,
quat
,
createMaterial
(
0x
F0A02
4
)
);
createObject
(
towerMass
,
towerHalfExtents
,
pos
,
quat
,
createMaterial
(
0x
B0301
4
)
);
// Tower 2
pos
.
set
(
8
,
5
,
0
);
quat
.
set
(
0
,
0
,
0
,
1
);
createObject
(
towerMass
,
towerHalfExtents
,
pos
,
quat
,
createMaterial
(
0x
F4A321
)
);
createObject
(
towerMass
,
towerHalfExtents
,
pos
,
quat
,
createMaterial
(
0x
B03214
)
);
//Bridge
var
bridgeMass
=
100
;
var
bridgeHalfExtents
=
new
THREE
.
Vector3
(
7
,
0.2
,
1.5
);
pos
.
set
(
0
,
10.2
,
0
);
quat
.
set
(
0
,
0
,
0
,
1
);
createObject
(
bridgeMass
,
bridgeHalfExtents
,
pos
,
quat
,
createMaterial
(
0xB3
883
5
)
);
createObject
(
bridgeMass
,
bridgeHalfExtents
,
pos
,
quat
,
createMaterial
(
0xB3
B86
5
)
);
// Stones
var
stoneMass
=
120
;
...
...
@@ -250,7 +250,7 @@
mountainPoints
.
push
(
new
THREE
.
Vector3
(
mountainHalfExtents
.
x
,
-
mountainHalfExtents
.
y
,
-
mountainHalfExtents
.
z
)
);
mountainPoints
.
push
(
new
THREE
.
Vector3
(
-
mountainHalfExtents
.
x
,
-
mountainHalfExtents
.
y
,
-
mountainHalfExtents
.
z
)
);
mountainPoints
.
push
(
new
THREE
.
Vector3
(
0
,
mountainHalfExtents
.
y
,
0
)
);
var
mountain
=
new
THREE
.
Mesh
(
new
THREE
.
Convex
Geometry
(
mountainPoints
),
createMaterial
(
0xFFB443
)
);
var
mountain
=
new
THREE
.
Mesh
(
new
THREE
.
Convex
BufferGeometry
(
mountainPoints
),
createMaterial
(
0xB03814
)
);
mountain
.
position
.
copy
(
pos
);
mountain
.
quaternion
.
copy
(
quat
);
convexBreaker
.
prepareBreakableObject
(
mountain
,
mountainMass
,
new
THREE
.
Vector3
(),
new
THREE
.
Vector3
(),
true
);
...
...
@@ -260,7 +260,7 @@
function
createParalellepipedWithPhysics
(
sx
,
sy
,
sz
,
mass
,
pos
,
quat
,
material
)
{
var
object
=
new
THREE
.
Mesh
(
new
THREE
.
BoxGeometry
(
sx
,
sy
,
sz
,
1
,
1
,
1
),
material
);
var
object
=
new
THREE
.
Mesh
(
new
THREE
.
Box
Buffer
Geometry
(
sx
,
sy
,
sz
,
1
,
1
,
1
),
material
);
var
shape
=
new
Ammo
.
btBoxShape
(
new
Ammo
.
btVector3
(
sx
*
0.5
,
sy
*
0.5
,
sz
*
0.5
)
);
shape
.
setMargin
(
margin
);
...
...
@@ -275,7 +275,7 @@
object
.
castShadow
=
true
;
object
.
receiveShadow
=
true
;
var
shape
=
createConvexHullPhysicsShape
(
object
.
geometry
.
vertices
);
var
shape
=
createConvexHullPhysicsShape
(
object
.
geometry
.
attributes
.
position
.
array
);
shape
.
setMargin
(
margin
);
var
body
=
createRigidBody
(
object
,
shape
,
object
.
userData
.
mass
,
null
,
null
,
object
.
userData
.
velocity
,
object
.
userData
.
angularVelocity
);
...
...
@@ -295,14 +295,14 @@
}
function
createConvexHullPhysicsShape
(
point
s
)
{
function
createConvexHullPhysicsShape
(
coord
s
)
{
var
shape
=
new
Ammo
.
btConvexHullShape
();
for
(
var
i
=
0
,
il
=
points
.
length
;
i
<
il
;
i
++
)
{
var
p
=
point
s
[
i
];
this
.
tempBtVec3_1
.
setValue
(
p
.
x
,
p
.
y
,
p
.
z
);
var
lastOne
=
(
i
===
(
il
-
1
)
);
for
(
var
i
=
0
,
il
=
coords
.
length
;
i
<
il
;
i
+=
3
)
{
var
p
=
coord
s
[
i
];
this
.
tempBtVec3_1
.
setValue
(
coords
[
i
],
coords
[
i
+
1
],
coords
[
i
+
2
]
);
var
lastOne
=
(
i
>=
(
il
-
3
)
);
shape
.
addPoint
(
this
.
tempBtVec3_1
,
lastOne
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录