Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Ablesons
three.js
提交
ca803d97
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,发现更多精彩内容 >>
提交
ca803d97
编写于
4月 27, 2013
作者:
R
renej-github
提交者:
Mr.doob
4月 27, 2013
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
moved NURBS utility function to NURBSUtils and code clean-up
上级
e154333d
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
405 addition
and
410 deletion
+405
-410
examples/canvas_geometry_nurbs.html
examples/canvas_geometry_nurbs.html
+1
-0
examples/webgl_geometry_nurbs.html
examples/webgl_geometry_nurbs.html
+7
-6
src/extras/core/NURBSCurve.js
src/extras/core/NURBSCurve.js
+2
-346
src/extras/core/NURBSSurface.js
src/extras/core/NURBSSurface.js
+1
-58
src/extras/core/NURBSUtils.js
src/extras/core/NURBSUtils.js
+394
-0
未找到文件。
examples/canvas_geometry_nurbs.html
浏览文件 @
ca803d97
...
...
@@ -28,6 +28,7 @@
<script
src=
"../build/three.min.js"
></script>
<script
src=
"js/libs/stats.min.js"
></script>
<script
src=
"../src/extras/core/NURBSUtils.js"
></script>
<script
src=
"../src/extras/core/NURBSCurve.js"
></script>
<script>
...
...
examples/webgl_geometry_nurbs.html
浏览文件 @
ca803d97
<!DOCTYPE html>
<html
lang=
"en"
>
<!-- based on webgl_geometry_shapes.html -->
<!-- based on webgl_geometry_shapes.html
and webgl_geometries2.html
-->
<head>
<title>
three.js webgl - geometry - NURBS
</title>
<meta
charset=
"utf-8"
>
...
...
@@ -24,9 +24,10 @@
<body>
<canvas
id=
"debug"
style=
"position:absolute; left:100px"
></canvas>
<div
id=
"info"
><a
href=
"http://threejs.org"
target=
"_blank"
>
three.js
</a>
- NURBS curve example
</div>
<div
id=
"info"
><a
href=
"http://threejs.org"
target=
"_blank"
>
three.js
</a>
- NURBS curve
and surface
example
</div>
<script
src=
"../build/three.min.js"
></script>
<script
src=
"../src/extras/core/NURBSUtils.js"
></script>
<script
src=
"../src/extras/core/NURBSCurve.js"
></script>
<script
src=
"../src/extras/core/NURBSSurface.js"
></script>
...
...
@@ -124,7 +125,7 @@
parent
.
add
(
nurbsLine
);
parent
.
add
(
nurbsControlPointsLine
);
// NURBS
S
urface
// NURBS
s
urface
var
nsControlPoints
=
[
[
...
...
@@ -135,8 +136,8 @@
],
[
new
THREE
.
Vector4
(
0
,
-
200
,
0
,
1
),
new
THREE
.
Vector4
(
0
,
-
100
,
-
100
,
1
),
new
THREE
.
Vector4
(
0
,
100
,
150
,
1
),
new
THREE
.
Vector4
(
0
,
-
100
,
-
100
,
5
),
new
THREE
.
Vector4
(
0
,
100
,
150
,
5
),
new
THREE
.
Vector4
(
0
,
200
,
0
,
1
)
],
[
...
...
@@ -165,7 +166,7 @@
return
nurbsSurface
.
getPoint
(
u
,
v
);
};
var
geo
=
new
THREE
.
ParametricGeometry
(
getSurfacePoint
,
50
,
5
0
);
var
geo
=
new
THREE
.
ParametricGeometry
(
getSurfacePoint
,
20
,
2
0
);
var
object
=
THREE
.
SceneUtils
.
createMultiMaterialObject
(
geo
,
materials
);
object
.
position
.
set
(
0
,
100
,
0
);
object
.
scale
.
multiplyScalar
(
1
);
...
...
src/extras/core/NURBSCurve.js
浏览文件 @
ca803d97
...
...
@@ -34,7 +34,7 @@ THREE.NURBSCurve.prototype.getPoint = function ( t ) {
var
u
=
this
.
knots
[
0
]
+
t
*
(
this
.
knots
[
this
.
knots
.
length
-
1
]
-
this
.
knots
[
0
]);
// linear mapping t->u
// following results in (wx, wy, wz, w) homogeneous point
var
hpoint
=
THREE
.
NURBS
Curve
.
Utils
.
calcBSplinePoint
(
this
.
degree
,
this
.
knots
,
this
.
controlPoints
,
u
);
var
hpoint
=
THREE
.
NURBSUtils
.
calcBSplinePoint
(
this
.
degree
,
this
.
knots
,
this
.
controlPoints
,
u
);
if
(
hpoint
.
w
!=
1.0
)
{
// project to 3D space: (wx, wy, wz, w) -> (x, y, z, 1)
hpoint
.
divideScalar
(
hpoint
.
w
);
...
...
@@ -47,354 +47,10 @@ THREE.NURBSCurve.prototype.getPoint = function ( t ) {
THREE
.
NURBSCurve
.
prototype
.
getTangent
=
function
(
t
)
{
var
u
=
this
.
knots
[
0
]
+
t
*
(
this
.
knots
[
this
.
knots
.
length
-
1
]
-
this
.
knots
[
0
]);
var
ders
=
THREE
.
NURBS
Curve
.
Utils
.
calcNURBSDerivatives
(
this
.
degree
,
this
.
knots
,
this
.
controlPoints
,
u
,
1
);
var
ders
=
THREE
.
NURBSUtils
.
calcNURBSDerivatives
(
this
.
degree
,
this
.
knots
,
this
.
controlPoints
,
u
,
1
);
var
tangent
=
ders
[
1
].
clone
();
tangent
.
normalize
();
return
tangent
;
};
/**************************************************************
* Utils
**************************************************************/
THREE
.
NURBSCurve
.
Utils
=
{
/*
Finds knot vector span.
p : degree
u : parametric value
U : knot vector
returns the span
*/
findSpan
:
function
(
p
,
u
,
U
)
{
var
n
=
U
.
length
-
p
-
1
;
if
(
u
>=
U
[
n
])
{
return
n
-
1
;
}
if
(
u
<=
U
[
p
])
{
return
p
;
}
var
low
=
p
;
var
high
=
n
;
var
mid
=
Math
.
floor
((
low
+
high
)
/
2
);
while
(
u
<
U
[
mid
]
||
u
>=
U
[
mid
+
1
])
{
if
(
u
<
U
[
mid
])
{
high
=
mid
;
}
else
{
low
=
mid
;
}
mid
=
Math
.
floor
((
low
+
high
)
/
2
);
}
return
mid
;
},
/*
Calculate basis functions. See The NURBS Book, page 70, algorithm A2.2
span : span in which u lies
u : parametric point
p : degree
U : knot vector
returns array[p+1] with basis functions values.
*/
calcBasisFunctions
:
function
(
span
,
u
,
p
,
U
)
{
var
N
=
[];
var
left
=
[];
var
right
=
[];
N
[
0
]
=
1.0
;
for
(
var
j
=
1
;
j
<=
p
;
++
j
)
{
left
[
j
]
=
u
-
U
[
span
+
1
-
j
];
right
[
j
]
=
U
[
span
+
j
]
-
u
;
var
saved
=
0.0
;
for
(
var
r
=
0
;
r
<
j
;
++
r
)
{
var
rv
=
right
[
r
+
1
];
var
lv
=
left
[
j
-
r
];
var
temp
=
N
[
r
]
/
(
rv
+
lv
);
N
[
r
]
=
saved
+
rv
*
temp
;
saved
=
lv
*
temp
;
}
N
[
j
]
=
saved
;
}
return
N
;
},
/*
Calculate B-Spline curve points. See The NURBS Book, page 82, algorithm A3.1.
p : degree of B-Spline
U : knot vector
P : control points (x, y, z, w)
u : parametric point
returns point for given u
*/
calcBSplinePoint
:
function
(
p
,
U
,
P
,
u
)
{
var
span
=
this
.
findSpan
(
p
,
u
,
U
);
var
N
=
this
.
calcBasisFunctions
(
span
,
u
,
p
,
U
);
var
C
=
new
THREE
.
Vector4
(
0
,
0
,
0
,
0
);
for
(
var
j
=
0
;
j
<=
p
;
++
j
)
{
var
point
=
P
[
span
-
p
+
j
];
var
Nj
=
N
[
j
];
var
wNj
=
point
.
w
*
Nj
;
C
.
x
+=
point
.
x
*
wNj
;
C
.
y
+=
point
.
y
*
wNj
;
C
.
z
+=
point
.
z
*
wNj
;
C
.
w
+=
point
.
w
*
Nj
;
}
return
C
;
},
/*
Calculate basis functions derivatives. See The NURBS Book, page 72, algorithm A2.3.
span : span in which u lies
u : parametric point
p : degree
n : number of derivatives to calculate
U : knot vector
returns array[n+1][p+1] with basis functions derivatives
*/
calcBasisFunctionDerivatives
:
function
(
span
,
u
,
p
,
n
,
U
)
{
var
zeroArr
=
[];
for
(
var
i
=
0
;
i
<=
p
;
++
i
)
zeroArr
[
i
]
=
0.0
;
var
ders
=
[];
for
(
var
i
=
0
;
i
<=
n
;
++
i
)
ders
[
i
]
=
zeroArr
.
slice
(
0
);
var
ndu
=
[];
for
(
var
i
=
0
;
i
<=
p
;
++
i
)
ndu
[
i
]
=
zeroArr
.
slice
(
0
);
ndu
[
0
][
0
]
=
1.0
;
var
left
=
zeroArr
.
slice
(
0
);
var
right
=
zeroArr
.
slice
(
0
);
for
(
var
j
=
1
;
j
<=
p
;
++
j
)
{
left
[
j
]
=
u
-
U
[
span
+
1
-
j
];
right
[
j
]
=
U
[
span
+
j
]
-
u
;
var
saved
=
0.0
;
for
(
var
r
=
0
;
r
<
j
;
++
r
)
{
var
rv
=
right
[
r
+
1
];
var
lv
=
left
[
j
-
r
];
ndu
[
j
][
r
]
=
rv
+
lv
;
var
temp
=
ndu
[
r
][
j
-
1
]
/
ndu
[
j
][
r
];
ndu
[
r
][
j
]
=
saved
+
rv
*
temp
;
saved
=
lv
*
temp
;
}
ndu
[
j
][
j
]
=
saved
;
}
for
(
var
j
=
0
;
j
<=
p
;
++
j
)
{
ders
[
0
][
j
]
=
ndu
[
j
][
p
];
}
for
(
var
r
=
0
;
r
<=
p
;
++
r
)
{
var
s1
=
0
;
var
s2
=
1
;
var
a
=
[];
for
(
var
i
=
0
;
i
<=
p
;
++
i
)
{
a
[
i
]
=
zeroArr
.
slice
(
0
);
}
a
[
0
][
0
]
=
1.0
;
for
(
var
k
=
1
;
k
<=
n
;
++
k
)
{
var
d
=
0.0
;
var
rk
=
r
-
k
;
var
pk
=
p
-
k
;
if
(
r
>=
k
)
{
a
[
s2
][
0
]
=
a
[
s1
][
0
]
/
ndu
[
pk
+
1
][
rk
];
d
=
a
[
s2
][
0
]
*
ndu
[
rk
][
pk
];
}
var
j1
=
(
rk
>=
-
1
)
?
1
:
-
rk
;
var
j2
=
(
r
-
1
<=
pk
)
?
k
-
1
:
p
-
r
;
for
(
var
j
=
j1
;
j
<=
j2
;
++
j
)
{
a
[
s2
][
j
]
=
(
a
[
s1
][
j
]
-
a
[
s1
][
j
-
1
])
/
ndu
[
pk
+
1
][
rk
+
j
];
d
+=
a
[
s2
][
j
]
*
ndu
[
rk
+
j
][
pk
];
}
if
(
r
<=
pk
)
{
a
[
s2
][
k
]
=
-
a
[
s1
][
k
-
1
]
/
ndu
[
pk
+
1
][
r
];
d
+=
a
[
s2
][
k
]
*
ndu
[
r
][
pk
];
}
ders
[
k
][
r
]
=
d
;
var
j
=
s1
;
s1
=
s2
;
s2
=
j
;
}
}
var
r
=
p
;
for
(
var
k
=
1
;
k
<=
n
;
++
k
)
{
for
(
var
j
=
0
;
j
<=
p
;
++
j
)
{
ders
[
k
][
j
]
*=
r
;
}
r
*=
p
-
k
;
}
return
ders
;
},
/*
Calculate derivatives of a B-Spline. See The NURBS Book, page 93, algorithm A3.2.
p : degree
U : knot vector
P : control points
u : Parametric points
nd : number of derivatives
returns array[d+1] with derivatives
*/
calcBSplineDerivatives
:
function
(
p
,
U
,
P
,
u
,
nd
)
{
var
du
=
nd
<
p
?
nd
:
p
;
var
CK
=
[];
var
span
=
this
.
findSpan
(
p
,
u
,
U
);
var
nders
=
this
.
calcBasisFunctionDerivatives
(
span
,
u
,
p
,
du
,
U
);
var
Pw
=
[];
for
(
var
i
=
0
;
i
<
P
.
length
;
++
i
)
{
var
point
=
P
[
i
].
clone
();
var
w
=
point
.
w
;
point
.
x
*=
w
;
point
.
y
*=
w
;
point
.
z
*=
w
;
Pw
[
i
]
=
point
;
}
for
(
var
k
=
0
;
k
<=
du
;
++
k
)
{
var
point
=
Pw
[
span
-
p
].
clone
().
multiplyScalar
(
nders
[
k
][
0
]);
for
(
var
j
=
1
;
j
<=
p
;
++
j
)
{
point
.
add
(
Pw
[
span
-
p
+
j
].
clone
().
multiplyScalar
(
nders
[
k
][
j
]));
}
CK
[
k
]
=
point
;
}
for
(
var
k
=
du
+
1
;
k
<=
nd
+
1
;
++
k
)
{
CK
[
k
]
=
new
THREE
.
Vector4
(
0
,
0
,
0
);
}
return
CK
;
},
/*
Calculate "K over I"
returns k!/(i!(k-i)!)
*/
calcKoverI
:
function
(
k
,
i
)
{
var
nom
=
1
;
for
(
var
j
=
2
;
j
<=
k
;
++
j
)
{
nom
*=
j
;
}
var
denom
=
1
;
for
(
var
j
=
2
;
j
<=
i
;
++
j
)
{
denom
*=
j
;
}
for
(
var
j
=
2
;
j
<=
k
-
i
;
++
j
)
{
denom
*=
j
;
}
return
nom
/
denom
;
},
/*
Calculate derivatives (0-nd) of rational curve. See The NURBS Book, page 127, algorithm A4.2.
Pders : result of function calcBSplineDerivatives
returns array with derivatives for rational curve.
*/
calcRationalCurveDerivatives
:
function
(
Pders
)
{
var
nd
=
Pders
.
length
;
var
Aders
=
[];
var
wders
=
[];
for
(
var
i
=
0
;
i
<
nd
;
++
i
)
{
var
point
=
Pders
[
i
];
Aders
[
i
]
=
new
THREE
.
Vector3
(
point
.
x
,
point
.
y
,
point
.
z
);
wders
[
i
]
=
point
.
w
;
}
var
CK
=
[];
for
(
var
k
=
0
;
k
<
nd
;
++
k
)
{
var
v
=
Aders
[
k
].
clone
();
for
(
var
i
=
1
;
i
<=
k
;
++
i
)
{
v
.
sub
(
CK
[
k
-
i
].
clone
().
multiplyScalar
(
this
.
calcKoverI
(
k
,
i
)
*
wders
[
i
]));
}
CK
[
k
]
=
v
.
divideScalar
(
wders
[
0
]);
}
return
CK
;
},
/*
Calculate NURBS curve derivatives. See The NURBS Book, page 127, algorithm A4.2.
p : degree
U : knot vector
P : control points in homogeneous space
u : parametric points
nd : number of derivatives
returns array with derivatives.
*/
calcNURBSDerivatives
:
function
(
p
,
U
,
P
,
u
,
nd
)
{
var
Pders
=
this
.
calcBSplineDerivatives
(
p
,
U
,
P
,
u
,
nd
);
return
this
.
calcRationalCurveDerivatives
(
Pders
);
}
};
src/extras/core/NURBSSurface.js
浏览文件 @
ca803d97
...
...
@@ -2,8 +2,6 @@
* @author renej
* NURBS surface object
*
* Derives from Curve, overriding getPoint and getTangent.
*
* Implementation is based on (x, y [, z=0 [, w=1]]) control points with w=weight.
*
**/
...
...
@@ -24,14 +22,10 @@ THREE.NURBSSurface = function ( degree1, degree2, knots1, knots2 /* arrays of re
var
len1
=
knots1
.
length
-
degree1
-
1
;
var
len2
=
knots2
.
length
-
degree2
-
1
;
//console.log("controlPoints: " + controlPoints);
//console.log("controlPoints[0][0].x: " + controlPoints[0][0].x);
// ensure Vector4 for control points
for
(
var
i
=
0
;
i
<
len1
;
++
i
)
{
this
.
controlPoints
[
i
]
=
[]
for
(
var
j
=
0
;
j
<
len2
;
++
j
)
{
//console.log("i=" + i + " j=" + j);
var
point
=
controlPoints
[
i
][
j
];
this
.
controlPoints
[
i
][
j
]
=
new
THREE
.
Vector4
(
point
.
x
,
point
.
y
,
point
.
z
,
point
.
w
);
}
...
...
@@ -45,62 +39,11 @@ THREE.NURBSSurface.prototype = {
getPoint
:
function
(
t1
,
t2
)
{
//console.log("this.knots1=" + this.knots1);
//console.log("this.knots2=" + this.knots2);
//console.log("this.controlPoints=" + this.controlPoints);
var
u
=
this
.
knots1
[
0
]
+
t1
*
(
this
.
knots1
[
this
.
knots1
.
length
-
1
]
-
this
.
knots1
[
0
]);
// linear mapping t1->u
var
v
=
this
.
knots2
[
0
]
+
t2
*
(
this
.
knots2
[
this
.
knots2
.
length
-
1
]
-
this
.
knots2
[
0
]);
// linear mapping t2->u
var
point
=
THREE
.
NURBSSurface
.
Utils
.
calcSurfacePoint
(
this
.
degree1
,
this
.
degree2
,
this
.
knots1
,
this
.
knots2
,
this
.
controlPoints
,
u
,
v
);
//console.log("u=" + u + " v=" + v + " point=" + point.x + ", " + point.y + ", " + point.z);
return
point
;
return
THREE
.
NURBSUtils
.
calcSurfacePoint
(
this
.
degree1
,
this
.
degree2
,
this
.
knots1
,
this
.
knots2
,
this
.
controlPoints
,
u
,
v
);
}
};
/**************************************************************
* Utils
**************************************************************/
THREE
.
NURBSSurface
.
Utils
=
{
/*
Calculate rational B-Spline surface point. See The NURBS Book, page 134, algorithm A4.3.
p1, p2 : degrees of B-Spline surface
U1, U2 : knot vectors
P : control points (x, y, z, w)
u, v : parametric values
returns point for given (u, v)
*/
calcSurfacePoint
:
function
(
p
,
q
,
U
,
V
,
P
,
u
,
v
)
{
var
uspan
=
THREE
.
NURBSCurve
.
Utils
.
findSpan
(
p
,
u
,
U
);
var
vspan
=
THREE
.
NURBSCurve
.
Utils
.
findSpan
(
q
,
v
,
V
);
var
Nu
=
THREE
.
NURBSCurve
.
Utils
.
calcBasisFunctions
(
uspan
,
u
,
p
,
U
);
var
Nv
=
THREE
.
NURBSCurve
.
Utils
.
calcBasisFunctions
(
vspan
,
v
,
q
,
V
);
var
temp
=
[];
for
(
var
l
=
0
;
l
<=
q
;
++
l
)
{
temp
[
l
]
=
new
THREE
.
Vector4
(
0
,
0
,
0
,
0
);
for
(
var
k
=
0
;
k
<=
p
;
++
k
)
{
var
point
=
P
[
uspan
-
p
+
k
][
vspan
-
q
+
l
].
clone
();
var
w
=
point
.
w
;
point
.
x
*=
w
;
point
.
y
*=
w
;
point
.
z
*=
w
;
temp
[
l
].
add
(
point
.
multiplyScalar
(
Nu
[
k
]));
}
}
var
Sw
=
new
THREE
.
Vector4
(
0
,
0
,
0
,
0
);
for
(
var
l
=
0
;
l
<=
q
;
++
l
)
{
Sw
.
add
(
temp
[
l
].
multiplyScalar
(
Nv
[
l
]));
}
Sw
.
divideScalar
(
Sw
.
w
);
return
new
THREE
.
Vector3
(
Sw
.
x
,
Sw
.
y
,
Sw
.
z
);
}
};
src/extras/core/NURBSUtils.js
0 → 100644
浏览文件 @
ca803d97
/**
* @author renej
* NURBS utils
*
* See NURBSCurve and NURBSSurface.
*
**/
/**************************************************************
* NURBS Utils
**************************************************************/
THREE
.
NURBSUtils
=
{
/*
Finds knot vector span.
p : degree
u : parametric value
U : knot vector
returns the span
*/
findSpan
:
function
(
p
,
u
,
U
)
{
var
n
=
U
.
length
-
p
-
1
;
if
(
u
>=
U
[
n
])
{
return
n
-
1
;
}
if
(
u
<=
U
[
p
])
{
return
p
;
}
var
low
=
p
;
var
high
=
n
;
var
mid
=
Math
.
floor
((
low
+
high
)
/
2
);
while
(
u
<
U
[
mid
]
||
u
>=
U
[
mid
+
1
])
{
if
(
u
<
U
[
mid
])
{
high
=
mid
;
}
else
{
low
=
mid
;
}
mid
=
Math
.
floor
((
low
+
high
)
/
2
);
}
return
mid
;
},
/*
Calculate basis functions. See The NURBS Book, page 70, algorithm A2.2
span : span in which u lies
u : parametric point
p : degree
U : knot vector
returns array[p+1] with basis functions values.
*/
calcBasisFunctions
:
function
(
span
,
u
,
p
,
U
)
{
var
N
=
[];
var
left
=
[];
var
right
=
[];
N
[
0
]
=
1.0
;
for
(
var
j
=
1
;
j
<=
p
;
++
j
)
{
left
[
j
]
=
u
-
U
[
span
+
1
-
j
];
right
[
j
]
=
U
[
span
+
j
]
-
u
;
var
saved
=
0.0
;
for
(
var
r
=
0
;
r
<
j
;
++
r
)
{
var
rv
=
right
[
r
+
1
];
var
lv
=
left
[
j
-
r
];
var
temp
=
N
[
r
]
/
(
rv
+
lv
);
N
[
r
]
=
saved
+
rv
*
temp
;
saved
=
lv
*
temp
;
}
N
[
j
]
=
saved
;
}
return
N
;
},
/*
Calculate B-Spline curve points. See The NURBS Book, page 82, algorithm A3.1.
p : degree of B-Spline
U : knot vector
P : control points (x, y, z, w)
u : parametric point
returns point for given u
*/
calcBSplinePoint
:
function
(
p
,
U
,
P
,
u
)
{
var
span
=
this
.
findSpan
(
p
,
u
,
U
);
var
N
=
this
.
calcBasisFunctions
(
span
,
u
,
p
,
U
);
var
C
=
new
THREE
.
Vector4
(
0
,
0
,
0
,
0
);
for
(
var
j
=
0
;
j
<=
p
;
++
j
)
{
var
point
=
P
[
span
-
p
+
j
];
var
Nj
=
N
[
j
];
var
wNj
=
point
.
w
*
Nj
;
C
.
x
+=
point
.
x
*
wNj
;
C
.
y
+=
point
.
y
*
wNj
;
C
.
z
+=
point
.
z
*
wNj
;
C
.
w
+=
point
.
w
*
Nj
;
}
return
C
;
},
/*
Calculate basis functions derivatives. See The NURBS Book, page 72, algorithm A2.3.
span : span in which u lies
u : parametric point
p : degree
n : number of derivatives to calculate
U : knot vector
returns array[n+1][p+1] with basis functions derivatives
*/
calcBasisFunctionDerivatives
:
function
(
span
,
u
,
p
,
n
,
U
)
{
var
zeroArr
=
[];
for
(
var
i
=
0
;
i
<=
p
;
++
i
)
zeroArr
[
i
]
=
0.0
;
var
ders
=
[];
for
(
var
i
=
0
;
i
<=
n
;
++
i
)
ders
[
i
]
=
zeroArr
.
slice
(
0
);
var
ndu
=
[];
for
(
var
i
=
0
;
i
<=
p
;
++
i
)
ndu
[
i
]
=
zeroArr
.
slice
(
0
);
ndu
[
0
][
0
]
=
1.0
;
var
left
=
zeroArr
.
slice
(
0
);
var
right
=
zeroArr
.
slice
(
0
);
for
(
var
j
=
1
;
j
<=
p
;
++
j
)
{
left
[
j
]
=
u
-
U
[
span
+
1
-
j
];
right
[
j
]
=
U
[
span
+
j
]
-
u
;
var
saved
=
0.0
;
for
(
var
r
=
0
;
r
<
j
;
++
r
)
{
var
rv
=
right
[
r
+
1
];
var
lv
=
left
[
j
-
r
];
ndu
[
j
][
r
]
=
rv
+
lv
;
var
temp
=
ndu
[
r
][
j
-
1
]
/
ndu
[
j
][
r
];
ndu
[
r
][
j
]
=
saved
+
rv
*
temp
;
saved
=
lv
*
temp
;
}
ndu
[
j
][
j
]
=
saved
;
}
for
(
var
j
=
0
;
j
<=
p
;
++
j
)
{
ders
[
0
][
j
]
=
ndu
[
j
][
p
];
}
for
(
var
r
=
0
;
r
<=
p
;
++
r
)
{
var
s1
=
0
;
var
s2
=
1
;
var
a
=
[];
for
(
var
i
=
0
;
i
<=
p
;
++
i
)
{
a
[
i
]
=
zeroArr
.
slice
(
0
);
}
a
[
0
][
0
]
=
1.0
;
for
(
var
k
=
1
;
k
<=
n
;
++
k
)
{
var
d
=
0.0
;
var
rk
=
r
-
k
;
var
pk
=
p
-
k
;
if
(
r
>=
k
)
{
a
[
s2
][
0
]
=
a
[
s1
][
0
]
/
ndu
[
pk
+
1
][
rk
];
d
=
a
[
s2
][
0
]
*
ndu
[
rk
][
pk
];
}
var
j1
=
(
rk
>=
-
1
)
?
1
:
-
rk
;
var
j2
=
(
r
-
1
<=
pk
)
?
k
-
1
:
p
-
r
;
for
(
var
j
=
j1
;
j
<=
j2
;
++
j
)
{
a
[
s2
][
j
]
=
(
a
[
s1
][
j
]
-
a
[
s1
][
j
-
1
])
/
ndu
[
pk
+
1
][
rk
+
j
];
d
+=
a
[
s2
][
j
]
*
ndu
[
rk
+
j
][
pk
];
}
if
(
r
<=
pk
)
{
a
[
s2
][
k
]
=
-
a
[
s1
][
k
-
1
]
/
ndu
[
pk
+
1
][
r
];
d
+=
a
[
s2
][
k
]
*
ndu
[
r
][
pk
];
}
ders
[
k
][
r
]
=
d
;
var
j
=
s1
;
s1
=
s2
;
s2
=
j
;
}
}
var
r
=
p
;
for
(
var
k
=
1
;
k
<=
n
;
++
k
)
{
for
(
var
j
=
0
;
j
<=
p
;
++
j
)
{
ders
[
k
][
j
]
*=
r
;
}
r
*=
p
-
k
;
}
return
ders
;
},
/*
Calculate derivatives of a B-Spline. See The NURBS Book, page 93, algorithm A3.2.
p : degree
U : knot vector
P : control points
u : Parametric points
nd : number of derivatives
returns array[d+1] with derivatives
*/
calcBSplineDerivatives
:
function
(
p
,
U
,
P
,
u
,
nd
)
{
var
du
=
nd
<
p
?
nd
:
p
;
var
CK
=
[];
var
span
=
this
.
findSpan
(
p
,
u
,
U
);
var
nders
=
this
.
calcBasisFunctionDerivatives
(
span
,
u
,
p
,
du
,
U
);
var
Pw
=
[];
for
(
var
i
=
0
;
i
<
P
.
length
;
++
i
)
{
var
point
=
P
[
i
].
clone
();
var
w
=
point
.
w
;
point
.
x
*=
w
;
point
.
y
*=
w
;
point
.
z
*=
w
;
Pw
[
i
]
=
point
;
}
for
(
var
k
=
0
;
k
<=
du
;
++
k
)
{
var
point
=
Pw
[
span
-
p
].
clone
().
multiplyScalar
(
nders
[
k
][
0
]);
for
(
var
j
=
1
;
j
<=
p
;
++
j
)
{
point
.
add
(
Pw
[
span
-
p
+
j
].
clone
().
multiplyScalar
(
nders
[
k
][
j
]));
}
CK
[
k
]
=
point
;
}
for
(
var
k
=
du
+
1
;
k
<=
nd
+
1
;
++
k
)
{
CK
[
k
]
=
new
THREE
.
Vector4
(
0
,
0
,
0
);
}
return
CK
;
},
/*
Calculate "K over I"
returns k!/(i!(k-i)!)
*/
calcKoverI
:
function
(
k
,
i
)
{
var
nom
=
1
;
for
(
var
j
=
2
;
j
<=
k
;
++
j
)
{
nom
*=
j
;
}
var
denom
=
1
;
for
(
var
j
=
2
;
j
<=
i
;
++
j
)
{
denom
*=
j
;
}
for
(
var
j
=
2
;
j
<=
k
-
i
;
++
j
)
{
denom
*=
j
;
}
return
nom
/
denom
;
},
/*
Calculate derivatives (0-nd) of rational curve. See The NURBS Book, page 127, algorithm A4.2.
Pders : result of function calcBSplineDerivatives
returns array with derivatives for rational curve.
*/
calcRationalCurveDerivatives
:
function
(
Pders
)
{
var
nd
=
Pders
.
length
;
var
Aders
=
[];
var
wders
=
[];
for
(
var
i
=
0
;
i
<
nd
;
++
i
)
{
var
point
=
Pders
[
i
];
Aders
[
i
]
=
new
THREE
.
Vector3
(
point
.
x
,
point
.
y
,
point
.
z
);
wders
[
i
]
=
point
.
w
;
}
var
CK
=
[];
for
(
var
k
=
0
;
k
<
nd
;
++
k
)
{
var
v
=
Aders
[
k
].
clone
();
for
(
var
i
=
1
;
i
<=
k
;
++
i
)
{
v
.
sub
(
CK
[
k
-
i
].
clone
().
multiplyScalar
(
this
.
calcKoverI
(
k
,
i
)
*
wders
[
i
]));
}
CK
[
k
]
=
v
.
divideScalar
(
wders
[
0
]);
}
return
CK
;
},
/*
Calculate NURBS curve derivatives. See The NURBS Book, page 127, algorithm A4.2.
p : degree
U : knot vector
P : control points in homogeneous space
u : parametric points
nd : number of derivatives
returns array with derivatives.
*/
calcNURBSDerivatives
:
function
(
p
,
U
,
P
,
u
,
nd
)
{
var
Pders
=
this
.
calcBSplineDerivatives
(
p
,
U
,
P
,
u
,
nd
);
return
this
.
calcRationalCurveDerivatives
(
Pders
);
},
/*
Calculate rational B-Spline surface point. See The NURBS Book, page 134, algorithm A4.3.
p1, p2 : degrees of B-Spline surface
U1, U2 : knot vectors
P : control points (x, y, z, w)
u, v : parametric values
returns point for given (u, v)
*/
calcSurfacePoint
:
function
(
p
,
q
,
U
,
V
,
P
,
u
,
v
)
{
var
uspan
=
this
.
findSpan
(
p
,
u
,
U
);
var
vspan
=
this
.
findSpan
(
q
,
v
,
V
);
var
Nu
=
this
.
calcBasisFunctions
(
uspan
,
u
,
p
,
U
);
var
Nv
=
this
.
calcBasisFunctions
(
vspan
,
v
,
q
,
V
);
var
temp
=
[];
for
(
var
l
=
0
;
l
<=
q
;
++
l
)
{
temp
[
l
]
=
new
THREE
.
Vector4
(
0
,
0
,
0
,
0
);
for
(
var
k
=
0
;
k
<=
p
;
++
k
)
{
var
point
=
P
[
uspan
-
p
+
k
][
vspan
-
q
+
l
].
clone
();
var
w
=
point
.
w
;
point
.
x
*=
w
;
point
.
y
*=
w
;
point
.
z
*=
w
;
temp
[
l
].
add
(
point
.
multiplyScalar
(
Nu
[
k
]));
}
}
var
Sw
=
new
THREE
.
Vector4
(
0
,
0
,
0
,
0
);
for
(
var
l
=
0
;
l
<=
q
;
++
l
)
{
Sw
.
add
(
temp
[
l
].
multiplyScalar
(
Nv
[
l
]));
}
Sw
.
divideScalar
(
Sw
.
w
);
return
new
THREE
.
Vector3
(
Sw
.
x
,
Sw
.
y
,
Sw
.
z
);
}
};
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录