GLScene三角形计数

时间:2015-03-19 14:50:55

标签: delphi 3d glscene

有没有办法找到场景中三角形的总数?我搜索了文档和类引用,但无法找到任何相关的程序或方法。

3 个答案:

答案 0 :(得分:0)

据我所知,无法在OpenGL中查询场景中顶点或三角形的总数...

答案 1 :(得分:0)

OpenGL不会跟踪您可能绘制的任何特定形状。相反,它跟踪顶点之间的连接。绘制三角形时,OpenGL不一定知道这是一个三角形。因此,您需要实现自己的方法来跟踪您正在绘制的形状,并查询您自己的形状参考。请记住,一般(2D或3D)绘图不是基于直线形状。可能有非常抽象的形状,甚至没有名称来称呼它们。

答案 2 :(得分:0)

那些说你必须自己跟踪添加对象的人是对的。但那些说在GLScene中计算三角形是不可能的人是错误的。如果您在TStrings中跟踪所有添加的GlFreeForms,您可以使用我为此目的编写的这个小函数来计算GLScene三角形:

function CountSceneTriangles(GLScene: TGlScene; SceneObjectList: TStrings): Integer;
var
  I, ITriCount: Integer;
  TempSceneObject: TGLBaseSceneObject;
begin
  ITriCount := 0;

  if (SceneObjectList.Count > 0) then
  begin
    for I := 0 to SceneObjectList.Count-1 do
    begin
      TempSceneObject:= Form1.GLScene1.FindSceneObject(SceneObjectList[I]));
      if (TempSceneObject <> nil) then
      begin
        ITriCount := ITriCount + (TGLFreeForm(TempSceneObject).MeshObjects.TriangleCount);
      end;
    end;
  end;

  result := ITriCount;
end;

只需将所有添加的GLFreeForm对象的TGLScene组件名称和跟踪列表传递给它:

procedure TForm1.FormCreate(Sender: TObject);
var
  SObjList: TStrings;
begin
  SObjList := TStrings.Create;
  SObjList.Add('GlFreeForm1'); //examples of tracked TGlFreeForms
  SObjList.Add('GlFreeForm2');
  SObjList.Add('GlFreeForm3');
  Form1.Caption := 'Triangles Count: ' + IntToStr(SObjList(Form1.GlScene1, SObjList));
  SObjList.Free;
end;

如果您需要计算除TGlFreeForm之外的其他对象的三角形,您可以按照相同的原则扩展此功能。祝你好运。