p5.js 中的两个不同形状的物体碰撞检测
Two different shaped objects collision detection in p5.js
我正在尝试让我的 Particle 对象碰撞并反射我的 Slate 对象。
如果我想使用椭圆,那会很简单,因为我可以只创建一个半径变量——不能用矩形来做。
和距离变量有关,我就是想不通
var div;
var movers;
function setup() {
createCanvas(windowWidth,windowHeight);
background("#FDEDEB");
div = new Slate();
movers = new Particle();
}
function draw() {
background("#FDEDEB");
div.display();
movers.display();
movers.update();
movers.move();
if (movers.hits(div)) {
console.log("hit");
}
}
function Slate() {
this.x = 30;
this.y = height/2;
this.display = function() {
noStroke();
fill("#DF4655");
rect(this.x,this.y, 700, 200);
}
}
function Particle() {
this.pos = createVector(10,0);
this.vel = createVector(0,0);
this.acc = createVector(0.01,0.01);
this.history = [];
this.display = function() {
fill("#DF4655");
point(this.pos.x,this.pos.y);
//beginShape();
for(var j = 0; j < this.history.length; j++) {
var pos = this.history[j];
ellipse(pos.x,pos.y, 5, 3);
}
//endShape();
}
this.update = function() {
var v = createVector(this.pos.x,this.pos.y);
this.history.push(v);
if (this.history.length > 10) {
this.history.splice(0,1);
}
}
this.hits = function(div) {
// BOUNCE OFF SLATE
var d = dist(this.pos.x,this.pos.y,div.x,div.y);
if (d < 0) {
console.log('hits');
}
}
this.move = function() {
this.pos.add(this.vel);
this.vel.add(this.acc);
this.vel.limit(10);
for (var i = 0; i < this.history.length; i++) {
this.history[i].x += random(-2,2);
this.history[i].y += random(-2,2);
}
}
}
如果粒子是一个点(或者可以表示为一个点),则需要使用点-矩形碰撞检测。基本上你需要检查点是否在矩形的左右边缘和顶部和底部边缘之间。
if(pointX > rectX && pointX < rectX + rectWidth && pointY > rectY && pointY < rectY + rectHeight){
//the point is inside the rectangle
}
如果粒子是椭圆并且您需要考虑该椭圆的半径,那么您最好将粒子表示为矩形,仅用于碰撞目的。然后你可以使用矩形-矩形碰撞检测。这也称为边界框,是处理碰撞检测的最常用方法之一。
if(rectOneRight > rectTwoLeft && rectOneLeft < rectTwoRight && rectOneBottom > rectTwoTop && rectOneTop < rectTwoBottom){
//the rectangles are colliding
}
无耻的自我推销:我写了一篇关于碰撞检测的教程可用here。它用于处理,但 P5.js.
的一切都相同
我正在尝试让我的 Particle 对象碰撞并反射我的 Slate 对象。
如果我想使用椭圆,那会很简单,因为我可以只创建一个半径变量——不能用矩形来做。
和距离变量有关,我就是想不通
var div;
var movers;
function setup() {
createCanvas(windowWidth,windowHeight);
background("#FDEDEB");
div = new Slate();
movers = new Particle();
}
function draw() {
background("#FDEDEB");
div.display();
movers.display();
movers.update();
movers.move();
if (movers.hits(div)) {
console.log("hit");
}
}
function Slate() {
this.x = 30;
this.y = height/2;
this.display = function() {
noStroke();
fill("#DF4655");
rect(this.x,this.y, 700, 200);
}
}
function Particle() {
this.pos = createVector(10,0);
this.vel = createVector(0,0);
this.acc = createVector(0.01,0.01);
this.history = [];
this.display = function() {
fill("#DF4655");
point(this.pos.x,this.pos.y);
//beginShape();
for(var j = 0; j < this.history.length; j++) {
var pos = this.history[j];
ellipse(pos.x,pos.y, 5, 3);
}
//endShape();
}
this.update = function() {
var v = createVector(this.pos.x,this.pos.y);
this.history.push(v);
if (this.history.length > 10) {
this.history.splice(0,1);
}
}
this.hits = function(div) {
// BOUNCE OFF SLATE
var d = dist(this.pos.x,this.pos.y,div.x,div.y);
if (d < 0) {
console.log('hits');
}
}
this.move = function() {
this.pos.add(this.vel);
this.vel.add(this.acc);
this.vel.limit(10);
for (var i = 0; i < this.history.length; i++) {
this.history[i].x += random(-2,2);
this.history[i].y += random(-2,2);
}
}
}
如果粒子是一个点(或者可以表示为一个点),则需要使用点-矩形碰撞检测。基本上你需要检查点是否在矩形的左右边缘和顶部和底部边缘之间。
if(pointX > rectX && pointX < rectX + rectWidth && pointY > rectY && pointY < rectY + rectHeight){
//the point is inside the rectangle
}
如果粒子是椭圆并且您需要考虑该椭圆的半径,那么您最好将粒子表示为矩形,仅用于碰撞目的。然后你可以使用矩形-矩形碰撞检测。这也称为边界框,是处理碰撞检测的最常用方法之一。
if(rectOneRight > rectTwoLeft && rectOneLeft < rectTwoRight && rectOneBottom > rectTwoTop && rectOneTop < rectTwoBottom){
//the rectangles are colliding
}
无耻的自我推销:我写了一篇关于碰撞检测的教程可用here。它用于处理,但 P5.js.
的一切都相同