Я использовал репо здесь 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);
Есть ли что-то, что мне нужно сделать в paintComponent в View.java, чтобы увеличить координаты для глубины?
Что я пробовал (с некоторым успехом):
Следующее работает с настройкой предполагаемой проекции, но увеличение 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);
}
}