旋转

时间:2018-01-22 21:58:11

标签: processing quaternions

我想在P3D中旋转一个立方体,我的代码使用实时传感器数据来做到这一点。 问题是多维数据集的先前方向始终是可见的并且重叠(如图中所示:http://i.stack.imgur.com/txXw6.jpg),这是我不想要的。我已经尝试了“提示(DISABLE_OPTIMIZED_STROKE)”和“提示(ENABLE_DEPTH_TEST)”功能,它什么也没做。除了提示函数,我在类似的问题上找不到任何东西。

如何只渲染当前方向?

import processing.serial.*;
import toxi.geom.*;

Serial myPort;

float qW;
float qX;
float qY;
float qZ;

float[] axis = new float[4];
Quaternion quat = new Quaternion(1, 0, 0, 0);

void setup()
{
  size(600, 400, P3D);

  myPort = new Serial(this, "COM3", 9600);                 

  background(0);
  lights();
}

void draw()
{
  serialEvent();

  quat.set(qW, qX, qY, qZ);
  axis = quat.toAxisAngle();

  pushMatrix(); 
  translate(width/2, height/2, -100);
  rotate(axis[0], axis[1], axis[2], axis[3]);
  noFill();
  stroke(255);
  box(330, 200, 40);
  popMatrix();
}

void serialEvent()
{
  int newLine = 13; // new line character in ASCII
  String message;

  do
  {
    message = myPort.readStringUntil(newLine); // read from port until new line

    if (message != null)
    {
      String[] list = split(trim(message), " ");
      if (list.length >= 4)
      {
        qW  = float(list[0]);
        qX  = float(list[1]);
        qY  = float(list[2]);
        qZ  = float(list[3]);
      }
    }
  } while (message != null);

}

1 个答案:

答案 0 :(得分:0)

您好像没有清除帧缓冲区。尝试添加background(0);作为draw();中的第一行:

void draw()
{
  //clear background
  background(0);

  serialEvent();

  quat.set(qW, qX, qY, qZ);
  axis = quat.toAxisAngle();

  pushMatrix(); 
  translate(width/2, height/2, -100);
  rotate(axis[0], axis[1], axis[2], axis[3]);
  noFill();
  stroke(255);
  box(330, 200, 40);
  popMatrix();
}

偏离主题,可能值得查看serialEvent()。 您可以在setup()

中执行此类操作
myPort = new Serial(this, "COM3", 9600);     
myPort.bufferUntil('\n');

你不需要在draw()中调用serialEvent(),串行库会这样做,因为它的缓冲。

然后在serialEvent()希望你可以逃脱:

String message = myPort.readString();
if(message !=null){
   String[] list = split(trim(message), " ");
   if (list.length >= 4)
      {
        qW  = float(list[0]);
        qX  = float(list[1]);
        qY  = float(list[2]);
        qZ  = float(list[3]);
      }
}