【问题标题】:Shape Creation using polygons doesnt work properly Java3d使用多边形创建形状无法正常工作 Java3d
【发布时间】:2021-09-27 18:24:03
【问题描述】:

总结一下这个问题,我有代码使用四边形创建一个立方体,但没有这样做,一些面孔没有明确的原因丢失,希望有人可以帮助我:)

由于某种原因,它不会产生控制台错误

这是应该创建一个立方体的代码:

package Main.Shapes;


import javax.media.j3d.QuadArray;
import javax.media.j3d.Shape3D;
import javax.vecmath.Point3f;

import com.sun.j3d.utils.geometry.GeometryInfo;
import com.sun.j3d.utils.geometry.NormalGenerator;

public class Square {
    Shape3D shape;
    
    public Square() {
        
    }
    
    public Shape3D Make(float Size) {
        QuadArray polygon1 = new QuadArray (24, QuadArray.COORDINATES);
        
        //Bottom
        polygon1.setCoordinate(0, new Point3f (-Size/2, -Size/2, Size/2));
        polygon1.setCoordinate(1, new Point3f (Size/2, -Size/2, Size/2));
        polygon1.setCoordinate(2, new Point3f(Size/2, -Size/2, -Size/2));
        polygon1.setCoordinate(3, new Point3f(-Size/2, -Size/2, -Size/2));
        
        //Front
        polygon1.setCoordinate(4, new Point3f (-Size/2, -Size/2, Size/2));
        polygon1.setCoordinate(5, new Point3f (Size/2, -Size/2, Size/2));
        polygon1.setCoordinate(6, new Point3f (Size/2, Size/2, Size/2));
        polygon1.setCoordinate(7, new Point3f (-Size/2, Size/2, Size/2));

        //Right
        polygon1.setCoordinate(8, new Point3f (Size/2, -Size/2, Size/2));
        polygon1.setCoordinate(9, new Point3f (Size/2, Size/2, Size/2));
        polygon1.setCoordinate(10, new Point3f(Size/2, Size/2, -Size/2));
        polygon1.setCoordinate(11, new Point3f(Size/2, -Size/2, -Size/2));
        
        //Back
        polygon1.setCoordinate(12, new Point3f (-Size/2, -Size/2, -Size/2));
        polygon1.setCoordinate(13, new Point3f (Size/2, -Size/2, -Size/2));
        polygon1.setCoordinate(14, new Point3f (Size/2, Size/2, -Size/2));
        polygon1.setCoordinate(15, new Point3f (-Size/2, Size/2, -Size/2));
        
        //Left
        polygon1.setCoordinate(16, new Point3f (-Size/2, -Size/2, Size/2));
        polygon1.setCoordinate(17, new Point3f (-Size/2, Size/2, Size/2));
        polygon1.setCoordinate(18, new Point3f(-Size/2, Size/2, -Size/2));
        polygon1.setCoordinate(19, new Point3f(-Size/2, -Size/2, -Size/2));
        
        //Top
        polygon1.setCoordinate(20, new Point3f (-Size/2, Size/2, Size/2));
        polygon1.setCoordinate(21, new Point3f (Size/2, Size/2, Size/2));
        polygon1.setCoordinate(22, new Point3f(Size/2, Size/2, -Size/2));
        polygon1.setCoordinate(23, new Point3f(-Size/2, Size/2, -Size/2));
        

        
        GeometryInfo GI = new GeometryInfo(polygon1);
        
          NormalGenerator normalGenerator = new NormalGenerator();
          normalGenerator.generateNormals(GI);

        shape = new Shape3D(GI.getIndexedGeometryArray());
        return shape;
    }
}

(本例中大小为浮点数,等于1)

Polygon 1 是保存所有四边形的变量,其点与形状的点相同。

但是,我没有完全创建立方体,而是缺少底部和背面,我尝试了多个订单,但似乎没有任何效果。

提前致谢:)

【问题讨论】:

  • 那是什么框架?你能把正确的标签吗?如果您将一些屏幕截图放入问题中以显示问题,这也可能会有所帮助。并且还要解释你的代码,而不是仅仅在那里转储大量代码。
  • @Zabuzard 我使用了正确的标签,该 api 被 oracle 称为 java-3d :)
  • 您是否尝试过颠倒不可见面的顶点顺序?看起来背面剔除正在这里发生。顺时针与逆时针确定一个面是正面还是背面
  • @QBrute 这样就不会为底部索引 0,1,2,3 而是 3,2,1,0?
  • 是这样的。我不知道 java-3d 是如何工作的,但你正在创建四边形,应该就是这样。

标签: java polygon shapes java-3d quad


【解决方案1】:

我在@QBrute 的帮助下找到了解决方法,问题是由于某种明显的原因我需要在创建一些面时向后索引点,但是如果你的四边形没有显示只是尝试向后索引它们:)

【讨论】:

    【解决方案2】:

    您所看到的称为Back-face culling。根据创建 tris / quads 的顺序(顺时针或逆时针添加顶点),您可以告诉框架该面是正面还是背面。

    根据框架处理face culling 的方式,面部是否可见(剔除)。

    看起来 java-3d 默认启用了背面剔除。因此,对于您的示例,您只需颠倒添加顶点的顺序即可。 (例如,对于底面,它的索引是 3,2,1,0 而不是 0,1,2,3

    【讨论】:

      猜你喜欢
      • 2011-06-03
      • 2012-12-02
      • 2016-01-25
      • 2022-10-20
      • 2013-04-06
      • 2016-07-08
      • 2019-12-02
      • 1970-01-01
      • 2015-08-02
      相关资源
      最近更新 更多