我正在学习如何使用推式和弹出式矩阵。我希望汽车(物体)绕其轴旋转,而不要与平移坐标的0,0一起旋转。 {初级编程爱好者}
当我使用rotate()时尝试重新转换轴。
PImage c = new PImage();
Car forza = new Car();
Trees tr = new Trees();
float wrap = 100;
void setup(){
size(800,800);
}
void draw(){
background(0);
forza.update();
forza.display();
tr.road();
}
class Car {
float posX;
float posY;
float speed;
float accel;
float angle;
Car(){
posX = 0;
posY = 0;
speed = .9;
angle = sin(0);
accel = 0;
}
void update(){
pushMatrix();
translate(posX,posY);
if (keyPressed) {
if (key == 'd') {
angle += 1;
}else if (key == 'a'){
angle -= 1;
rotate(radians(angle));
} else if (key == 'w'){
posX += speed;
} else if (key == 's'){
posX -= speed;
}
}
popMatrix();
}
void display(){
pushMatrix();
translate(width/2,height/2);
rotate(radians(angle));
c = loadImage("car.jpg");
fill(255);
stroke(255);
imageMode(CENTER);
image(c,posX,posY,wrap,wrap);
line(0,0,posX,posY);
print(posX);
println(posY);
popMatrix();
}
}
class Trees {
float x;
float y;
Trees(){
//x = random(0,);
}
void trash(){
}
void road(){
fill(250,50);
rectMode(CENTER);
rect(width/2,height/2, width/2, height);
}
void show(){
}
}
我只是想知道它的算法,以及是否有其他方法可以提高效率和美观度。 ^^
答案 0 :(得分:1)
如果对象应绕其原点旋转,则必须在平移之前完成旋转。由于rotate()
和translate()
之类的操作会设置一个矩阵并将当前矩阵乘以新矩阵,因此这意味着rotate()
必须在绘制对象之前完成。即使在某个位置绘制对象(例如posX
,posY
),其行为也像翻译一样。
您必须在位置(0,0)上绘制汽车。然后,您必须旋转它。最后将其翻译成最终位置:
void display(){
pushMatrix();
translate(width/2,height/2);
pushMatrix();
translate(posX,posY);
rotate(radians(angle));
fill(255);
stroke(255);
imageMode(CENTER);
image(c,0,0,wrap,wrap);
popMatrix();
line(0,0,posX,posY);
popMatrix();
}
矩阵操作操作,更改矩阵。矩阵被应用于绘图操作中的坐标。 update
中的矩阵运算是无用的,因为开头是pushMatrix()
,结尾是popMatrix()
,但是什么也没画。
在每个帧中加载图像,然后在Car
的构造函数中执行一次,这是一种浪费性能。
请参见示例:
Car forza;
Trees tr;
float wrap = 100;
void setup(){
size(800,800);
forza = new Car();
tr = new Trees();
}
void draw(){
background(0);
forza.update();
forza.display();
tr.road();
}
class Car {
float posX;
float posY;
float speed;
float accel;
float angle;
PImage c;
Car(){
posX = 0;
posY = 0;
speed = .9;
angle = sin(0);
accel = 0;
c = loadImage("car.jpg");
}
void update(){
if (keyPressed) {
if (key == 'd') {
angle += 1;
}else if (key == 'a'){
angle -= 1;
} else if (key == 'w'){
posX += speed;
} else if (key == 's'){
posX -= speed;
}
}
}
void display(){
pushMatrix();
translate(width/2,height/2);
pushMatrix();
translate(posX,posY);
rotate(radians(angle));
fill(255);
stroke(255);
imageMode(CENTER);
image(c,0,0,wrap,wrap);
popMatrix();
line(0,0,posX,posY);
popMatrix();
}
}
class Trees {
float x;
float y;
Trees(){
//x = random(0,);
}
void trash(){
}
void road(){
fill(250,50);
rectMode(CENTER);
rect(width/2,height/2, width/2, height);
}
void show(){
}
}