Z轴上的Java BVH解析器平移

时间:2019-01-14 00:13:11

标签: java animation paint

我一直在这里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

我需要在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);
            }
        }

0 个答案:

没有答案