1

我正在编写一个 3D 草图,其中用户在左键单击和移动鼠标的同时使用 peasyCam 旋转相机。问题是我想在按下右键时移动对象,以便用户可以在屏幕的 X 和 Y 轴上拖动对象。当然,我知道如何使用 mouseX 和 mouseY 输入来修改平移,但只能跨越 3D 空间坐标,如下面的 GIF 所示:

图像中发生的事情的示例代码:

import peasy.*;
import peasy.org.apache.commons.math.*;
import peasy.org.apache.commons.math.geometry.*;

PeasyCam cam;

float x=15;float y=15; float z=15;
float e;

void setup(){
  size (700,700,P3D);
  cam = new PeasyCam(this, 200);
  cam.setRightDragHandler(null);


}
void draw(){
  background(0);
  pushMatrix();
  translate(5, 5, 0);
  fill(255);
  stroke(255);
  sphere(5);
  popMatrix();
  pushMatrix();
  fill(255,0,0);
  stroke(255,0,0);
  translate(x, y, z);
  sphere(5);
  popMatrix();
  stroke(0,0,255);
  line(5,5,0,x,y,z);
  //obvoiusly not working method
  if(mousePressed && (mouseButton == RIGHT)){
    x= x+(mouseX-pmouseX);
    y= y+(mouseY-pmouseY);
  }
}
void mouseWheel(MouseEvent event) {
  e = event.getCount();
  z=z+e;
  println(e);
}
void mousePressed(){
  if (mouseButton==RIGHT){
    cam.setActive(false);
  }
}
void mouseReleased(){
 cam.setActive(true);
}

我需要的是能够仅在屏幕 X/Y 轴上拖动球体,在固定的 Z 上,如下图所示(我对我正在寻找的行为进行的简单模拟)。

PeasyCam 用于探索 3D 空间。这个问题可能很难理解。问题是关于在 3D 世界上移动对象,使用屏幕/画布 2D 坐标使对象跟随光标的移动。如果鼠标向左移动(x 轴减小),对象应该在屏幕上向左移动,而不仅仅是在世界 X 轴上。这是第二个示例图像的行为方式,但仅通过模拟 3D 空间来实现,而没有实际旋转到 x、y、z 轴。

我一直在用这个东西挠头,我似乎无法弄清楚。否则我不会在这里问。提前谢谢各位。

4

2 回答 2

1

PeasyCam 是一个库,它为您提供默认由鼠标控制的相机。这使您可以渲染 3D 场景而不必担心相机,因为库会为您处理它。

但听起来这不是你想要的。您想要渲染 3D 场景使用鼠标控制该场景中形状的位置。基本上,您的控件与 PeasyCam 库提供的默认控件相冲突。

我看到您已经尝试在此处禁用右键单击控件:

cam.setRightDragHandler(null);

所以至少你可能想用左拖动处理程序做同样的事情。

但是到那时,你为什么要使用 PeasyCam 库呢?

即使你禁用了默认的左侧控件,你也会注意到形状的拖动是“夸张的”,因为相机更接近红色形状,所以稍微移动它看起来像是在移动更多。就像你面前的一个物体看起来比远处的物体移动得更多。

听起来您真正想做的是摆脱 PeasyCam 库,然后使用标准处理函数根据用户输入计算球体的位置。查看参考资料中的modelX()modelY()modelZ()函数。

编辑:这是一个简单的例子,展示了模型函数的作用:

float x;
float y;

void setup() {
  size (700, 700, P3D);
}
void draw() {
  background(0);

  pushMatrix();
  translate(width/2, height/2, 0);
  fill(255);
  stroke(255);
  sphere(5);
  popMatrix();

  fill(255, 0, 0);
  stroke(255, 0, 0);

  if (mousePressed) {
    x= modelX(mouseX, mouseY, 0);
    y= modelY(mouseX, mouseY, 0);
  }
  translate(x, y, 15);
  sphere(5);
}

球体

于 2017-05-26T01:04:29.840 回答
0

可能你应该查看 beginHUD() 和 endHUD();

这是示例代码:(来自https://forum.processing.org/one/topic/2-questions-on-camera-view.html的代码)

import peasy.*;
PeasyCam cam;

void setup() {
  size(300,200,P3D);
  // either put it here like this:
  // cam = new PeasyCam(this, 50, 0, 0, 100);
  cam = new PeasyCam(this, 0, 0, 0, 100);
  cam.setMinimumDistance(50);
  cam.setMaximumDistance(500);
  // or separate like this:
  cam.lookAt(50,0,0);
}

void draw() {
  background(0);

  //3D object
  pushMatrix();
  fill(255,0,0);
  translate(50,0,0);
  rotateX(-.5);
  rotateY(-.5);
  box(30);
  popMatrix();
 
  //2D object that is not affected  by the camera
  cam.beginHUD();
  fill(0,0,255);
  rect(200, height/2 -25 , 50, 50);
  cam.endHUD();
}
于 2020-08-28T07:19:09.650 回答