在 PaperJS 中,围绕点旋转形状无法正常工作
In PaperJS rotating a shape around point is not working properly
我正在尝试重新制作小行星游戏。这是 Ship 对象构造函数的代码示例(我使用的是构造函数而不是对象文字,因为 this
在引用文字中的变量时无法正常工作):
function Ship(pos) {
var position = pos ? pos : view.center;
var segments = [
new Point(position) + new Point(0, -7.5), // Front of ship
new Point(position) + new Point(-5, 7.5), // Back left
new Point(position) + new Point(0, 3.5), // Rear exhaust indentation
new Point(position) + new Point(5, 7.5) // Back right
]
this.shipPath = new Path.Line({
segments: segments,
closed: true,
strokeColor: '#eee',
strokeWidth: 2
});
this.velocity = new Point(0, -1);
this.steering = new Point(0, -1);
this.rot = function(ang) {
this.steering.angle += ang;
this.shipPath.rotate(ang, this.shipPath.position);
}
this.drive = function() {
this.shipPath.position += this.velocity;
}
}
var ship = new Ship();
var path = new Path({
strokeColor: '#ddd',
strokeWidth: 1
});
function onFrame(event) {
path.add(ship.shipPath.position);
ship.drive();
}
我已经省略了关键处理程序,这就是船的操纵方式,但基本上他们所做的是根据点击的是右按钮还是左按钮,以不同的角度调用 this.rot()
函数。
基本上我的问题是,根据这个,当驾驶船时,船应该围绕其 shipPath.position
旋转,这将使该点在船围绕它旋转时沿直线行驶。相反,这正在发生:
path
中的卷曲部分是我连续驾驶船几秒钟时造成的。为什么会这样?如果船绕着它的 position
旋转,为什么船旋转时位置会向侧面抖动?
这是 link 我在自己的网站上使用它的地方:http://aronadler.com/asteroid/
我很想把它放在 jsbin 或 codepen 上,但尽管工作了好几个小时,但我从未能够真正让 paperscript 在 javascript.
中工作
Here is a sketch。因为出于某种原因,Sketch 不会让箭头键被检测到,所以我给了它一个自动恒定旋转。效果是一样的。
原因是path.bounds.center不是三角形的中心。默认的旋转中心是 path.bounds.center。参见 sketch。红点是 bounds.center,绿色矩形是边界矩形。
您想围绕三角形中心(技术上是质心)旋转,可以通过找到从顶点到对边中点的 2/3 路径的点来计算。
下面是一些计算三角形质心的代码:
function centroid(triangle) {
var segments = triangle.segments;
var vertex = segments[0].point;
var opposite = segments[1].point - (segments[1].point - segments[2].point) / 2;
var c = vertex + (opposite - vertex) * 2/3;
return c;
}
更新后的 sketch 显示在计算质心时中心如何相对于您的三角形不移动,因为它是旋转的。
并且我已经将您的 sketch 更新为使用质心而不是位置。它现在直线移动。
我正在尝试重新制作小行星游戏。这是 Ship 对象构造函数的代码示例(我使用的是构造函数而不是对象文字,因为 this
在引用文字中的变量时无法正常工作):
function Ship(pos) {
var position = pos ? pos : view.center;
var segments = [
new Point(position) + new Point(0, -7.5), // Front of ship
new Point(position) + new Point(-5, 7.5), // Back left
new Point(position) + new Point(0, 3.5), // Rear exhaust indentation
new Point(position) + new Point(5, 7.5) // Back right
]
this.shipPath = new Path.Line({
segments: segments,
closed: true,
strokeColor: '#eee',
strokeWidth: 2
});
this.velocity = new Point(0, -1);
this.steering = new Point(0, -1);
this.rot = function(ang) {
this.steering.angle += ang;
this.shipPath.rotate(ang, this.shipPath.position);
}
this.drive = function() {
this.shipPath.position += this.velocity;
}
}
var ship = new Ship();
var path = new Path({
strokeColor: '#ddd',
strokeWidth: 1
});
function onFrame(event) {
path.add(ship.shipPath.position);
ship.drive();
}
我已经省略了关键处理程序,这就是船的操纵方式,但基本上他们所做的是根据点击的是右按钮还是左按钮,以不同的角度调用 this.rot()
函数。
基本上我的问题是,根据这个,当驾驶船时,船应该围绕其 shipPath.position
旋转,这将使该点在船围绕它旋转时沿直线行驶。相反,这正在发生:
path
中的卷曲部分是我连续驾驶船几秒钟时造成的。为什么会这样?如果船绕着它的 position
旋转,为什么船旋转时位置会向侧面抖动?
这是 link 我在自己的网站上使用它的地方:http://aronadler.com/asteroid/
我很想把它放在 jsbin 或 codepen 上,但尽管工作了好几个小时,但我从未能够真正让 paperscript 在 javascript.
Here is a sketch。因为出于某种原因,Sketch 不会让箭头键被检测到,所以我给了它一个自动恒定旋转。效果是一样的。
原因是path.bounds.center不是三角形的中心。默认的旋转中心是 path.bounds.center。参见 sketch。红点是 bounds.center,绿色矩形是边界矩形。
您想围绕三角形中心(技术上是质心)旋转,可以通过找到从顶点到对边中点的 2/3 路径的点来计算。
下面是一些计算三角形质心的代码:
function centroid(triangle) {
var segments = triangle.segments;
var vertex = segments[0].point;
var opposite = segments[1].point - (segments[1].point - segments[2].point) / 2;
var c = vertex + (opposite - vertex) * 2/3;
return c;
}
更新后的 sketch 显示在计算质心时中心如何相对于您的三角形不移动,因为它是旋转的。
并且我已经将您的 sketch 更新为使用质心而不是位置。它现在直线移动。