球面上两点之间的三次贝塞尔曲线
Cubic Bezier Curve between two points on a sphere in three.js
我让用户点击球体上的两点,然后我想沿着球体表面(基本上在大圆上)在两点之间画一条线。我已经能够得到两个选定点的坐标,并在这两个点之间画一个QuadraticBezierCurve3
,但我需要使用CubicBezierCurve3
。问题是我不知道如何找到这两个控制点。
部分问题是我发现的所有东西都是圆弧,只处理[x,y]坐标(而我正在处理[x,y,z])。我发现了另一个问题,我用QuadraticBezierCurve3
得到了一个有效的解决方案。我已经找到了许多其他的页面与数学/代码像这样,这样,和这样,但我真的不知道该应用什么。我遇到的另一件事提到了切线(到选定点),它们的交点和中点。但是,我不确定如何在3D空间中做到这一点(因为切线可以在多个方向上,即一个平面)。
我的代码示例:http://jsfiddle.net/GhB82/
画线,我使用:
function drawLine(point) {
var middle = [(pointA['x'] + pointB['x']) / 2, (pointA['y'] + pointB['y']) / 2, (pointA['z'] + pointB['z']) / 2];
var curve = new THREE.QuadraticBezierCurve3(new THREE.Vector3(pointA['x'], pointA['y'], pointA['z']), new THREE.Vector3(middle[0], middle[1], middle[2]), new THREE.Vector3(pointB['x'], pointB['y'], pointB['z']));
var path = new THREE.CurvePath();
path.add(curve);
var curveMaterial = new THREE.LineBasicMaterial({
color: 0xFF0000
});
curvedLine = new THREE.Line(path.createPointsGeometry(20), curveMaterial);
scene.add(curvedLine);
}
其中pointA和pointB是包含球体上所选点的[x,y,z]坐标的数组。我需要将QuadraticBezierCurve3
更改为CubicBezierCurve3
,但是再一次,我真的找不到那些控制点。
我在http://pomax.github.io/bezierinfo/#circles_cubic上有一个关于如何将三次曲线拟合为圆弧的描述,3D情况基本上是相同的,因为你需要找出两点在球体上形成的(大)圆形截面,然后沿着该圆建立三次贝塞尔截面。
缺点:除非你的弧线小于或等于大约四分之一圆,否则一条曲线是不够的,你需要两条或更多。你实际上不能用贝塞尔曲线来模拟真正的圆形曲线,所以使用三次曲线而不是二次曲线只是意味着你可以在它开始看起来很糟糕之前近似一个更长的弧段。
因此,一个完全不同的解决方案注意:如果你有一个arc命令可用,使用它比自己滚(如果three.js不支持它们,绝对值得提交一个特性请求,我认为)
- socket.io发射三次
- SVG实现的单调三次插值没有像d3这样的库
- readyState=4三次.Ajax-由警报引起
- Raphael悬停事件和调整大小框在第三次鼠标悬停后发生故障
- Javascript拉斐尔奇怪的闪烁发生在我鼠标悬停的第三次
- Ajax请求三次都不起作用,然后就起作用了
- 弹出循环:添加数据时停止重复/三次应用/X
- 如何让onclick第三次做一些不同的事情
- 在第三次onPageClick事件后,使用twbspagination插件和AJAX更新JS分页
- ajax表单在第二次提交时提交了两次,在第三次提交时又提交了三次,等等
- 使插值双三次函数在ie9中工作
- 在给定曲线的最大高度的情况下,获取二次曲线的 Y 值
- 为什么$scope成员被访问三次
- 了解三次插值的实现
- 正确计算双三次曲线上的点;zier曲面
- 球面上两点之间的三次贝塞尔曲线
- 添加三次贝塞尔曲线到小叶路径
- 求出三次贝塞尔曲线上给定点的系数/函数
- 如何将 SVG'c' 曲线转换为三次贝塞尔曲线列表
- 用二次贝塞尔曲线和三次贝塞尔曲线绘制椭圆