Перевод парсера Java BVH по оси Z - PullRequest
0 голосов
/ 14 января 2019

Я использовал репо здесь 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);
    }

translation honored Однако, если я перевожу, а затем поверну (разрешив вращение вокруг узла 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);            

translation ignored

Есть ли что-то, что мне нужно сделать в 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);
            }
        }
...