我一直在这里JavaBVHParser处使用回购作为BVH动画的起点。它具有完整的BVH动画的基本框架,但是我很难在Z轴上平移。我想创建一些控件,允许用户移动模型,并且要进行局部旋转,我需要先变换然后旋转。
在Node.java中,如果我旋转然后进行翻译,则所有的转换数据都会得到尊重。
private void setPose(double[] data, int[] dataIndex) {
if (type == ROOT) {
//rotation
transformTmp.setRotationX(Math.toRadians(10));
transform.multiply(transformTmp);
transformTmp.setRotationY(Math.toRadians(10));
transform.multiply(transformTmp);
transformTmp.setRotationZ(Math.toRadians(10));
transform.multiply(transformTmp);
//translation
transformTmp.setTranslation(0,0,15);
transform.multiply(transformTmp);
}
但是,如果我平移然后旋转(允许绕ROOT节点旋转),则Z平移将被忽略。
private void setPose(double[] data, int[] dataIndex) {
if (type == ROOT) {
//translation
transformTmp.setTranslation(0,0,15);
transform.multiply(transformTmp);
//rotation
transformTmp.setRotationX(Math.toRadians(10));
transform.multiply(transformTmp);
transformTmp.setRotationY(Math.toRadians(10));
transform.multiply(transformTmp);
transformTmp.setRotationZ(Math.toRadians(10));
transform.multiply(transformTmp);
我需要在View.java的paintComponent中做一些事情来增加深度的坐标吗?
我尝试过的方法(取得了一些成功)
以下内容用于设置预期投影,但是增加x会将模型向左移动。但是,这似乎遵循了右手定则,所以我不确定这是否是错误的行为。 y向上移动,z向上移动离开前裁剪平面。
private void setPose(double[] data, int[] dataIndex, int width) {
if (type == ROOT) {
//set up the perspective...
transform.setPerspectiveProjection(90, width);
//translation
...
//rotation
在View.java中
double scale = 100;
for (int n = 0; n < skeleton.getNodes().size(); n++) {
Node node = skeleton.getNodes().get(n);
int x1 = (int) (scale*(node.getPosition().getX()*10/node.getPosition().getZ()));
int y1 = (int) -(scale*(node.getPosition().getY()*10/node.getPosition().getZ()));
g2d.setColor(Color.RED);
g2d.fillOval((int) (x1 - 2), (int) (y1 - 2), 4, 4);
//g2d.drawString(node.getName(), x1 + 10, y1);
g2d.setColor(Color.BLUE);
for (Node child : node.getChildrens()) {
int x2 = (int) (scale*(child.getPosition().getX()*10/child.getPosition().getZ()));
int y2 = (int) -(scale*(child.getPosition().getY()*10/child.getPosition().getZ()));
g2d.drawLine(x1, y1, x2, y2);
}
}