opencascade AIS_TexturedShape源码学习 贴纹理 原创

opencascade AIS_TexturedShape
opencascade 贴纹理

前言

//! 该类允许在形状上映射纹理。
//! 显示模式 AIS_WireFrame (0) 和 AIS_Shaded (1) 的行为与 AIS_Shape 中的行为相同,
//! 而新模式 2 (包围盒) 和 3 (纹理映射) 扩展了其功能。
//!
//! 纹理本身在 (0,1)x(0,1) 的参数空间内进行参数化。
//! 形状的每个位于 UV 空间中的面都具有以下参数:
//! - Umin - U 方向的起始位置
//! - Umax - U 方向的结束位置
//! - Vmin - V 方向的起始位置
//! - Vmax - V 方向的结束位置
//! 每个面都被三角化,并且每个节点被分配一个纹素。
//! 面片然后使用纹理的线性插值填充每个 ‘三个纹素’ 之间的区域。
//! 用户可以控制:
//! - 纹理在面上的重复次数
//! - 纹理原点的位置
//! - 纹理的缩放因子
该类用于在形状上进行纹理映射,介绍了纹理的参数化方式、面的参数化、三角化和纹理映射的基本原理,以及用户可以控制的几个关键因素。

在这里插入图片描述

方法

1

初始化带纹理的形状。
Standard_EXPORT AIS_TexturedShape (const TopoDS_Shape& theShape);

2

//! 设置纹理源。 可以指定纹理图像的路径或标准预定义纹理之一。
//! 接受的文件类型与 Image_AlienPixMap 中使用的类型相同,如 rgb、png、jpg 等。
//! 若要指定标准预定义纹理, 应包含 Graphic3d_NameOfTexture2D 枚举索引。
//! 使用此方法设置纹理源会重置源像素图(如果之前设置过)。
Standard_EXPORT virtual void SetTextureFileName (const TCollection_AsciiString& theTextureFileName);

3

//! 设置纹理源。 指定图像数据。
//! 注意,数据应按从底向上的顺序排列,图形驱动程序将忽略 Image_PixMap::IsTopDown() 标志。
//! 使用此方法设置纹理源会重置源文件名(如果之前设置过)。
Standard_EXPORT virtual void SetTexturePixMap (const Handle(Image_PixMap)& theTexturePixMap);

3

//! @return 控制纹理映射的标志(用于显示模式 3)
Standard_Boolean TextureMapState() const { return myToMapTexture; }

4

//! 启用纹理映射
Standard_EXPORT void SetTextureMapOn();

5

//! 禁用纹理映射
Standard_EXPORT void SetTextureMapOff();

6

//! @return 纹理文件的路径
Standard_CString TextureFile() const { return myTextureFile.ToCString(); }

7

//! @return 纹理映射的源像素图
const Handle(Image_PixMap)& TexturePixMap() const { return myTexturePixMap; }

8

public: //! @name 修改纹理映射属性的方法

9

//! 使用此方法显示带纹理的形状,而无需重新计算整个表示。
//! 当仅更改纹理内容时使用此方法。
//! 如果其他参数(例如:缩放因子、纹理原点、纹理重复等)发生了变化,则必须重新计算整个表示:
//! @code
//! if (myShape->DisplayMode() == 3)
//! {
//! myAISContext->RecomputePrsOnly (myShape);
//! }
//! else
//! {
//! myAISContext->SetDisplayMode (myShape, 3, Standard_False);
//! myAISContext->Display (myShape, Standard_True);
//! }
//! @endcode
Standard_EXPORT void UpdateAttributes();

10

//! 设置颜色。
Standard_EXPORT virtual void SetColor (const Quantity_Color& theColor) Standard_OVERRIDE;

11

//! 移除颜色设置。
Standard_EXPORT virtual void UnsetColor() Standard_OVERRIDE;

12

//! 设置材料方面。
Standard_EXPORT virtual void SetMaterial (const Graphic3d_MaterialAspect& theAspect) Standard_OVERRIDE;

13

//! 移除材料方面设置。
Standard_EXPORT virtual void UnsetMaterial() Standard_OVERRIDE;

14

//! 启用纹理调制
Standard_EXPORT void EnableTextureModulate();

15

//! 禁用纹理调制
Standard_EXPORT void DisableTextureModulate();

17

//! @return 纹理重复标志
Standard_Boolean TextureRepeat() const { return myToRepeat; }

18

//! @return 纹理重复的 U 值
Standard_Real URepeat() const { return myUVRepeat.X(); }

19

//! @return 纹理重复的 V 值
Standard_Real VRepeat() const { return myUVRepeat.Y(); }

20

//! 设置每个面上的纹理重复次数。纹理本身在 (0,1)x(0,1) 的参数空间内进行参数化。
//! 要纹理化的形状的每个面在 UV 空间中为 (Umin,Umax) x (Vmin,Vmax) 进行参数化。
//! 如果 RepeatYN 设置为 false,则纹理坐标被夹在面的 (0,1)x(0,1) 范围内。
Standard_EXPORT void SetTextureRepeat (const Standard_Boolean theToRepeat,
const Standard_Real theURepeat = 1.0,
const Standard_Real theVRepeat = 1.0);

21

//! @return 如果纹理 UV 原点已修改,则返回 true
Standard_Boolean TextureOrigin() const { return myIsCustomOrigin; }

22

//! @return 纹理原点的 U 位置(默认为 0.0)
Standard_Real TextureUOrigin() const { return myUVOrigin.X(); }

23

//! @return 纹理原点的 V 位置(默认为 0.0)
Standard_Real TextureVOrigin() const { return myUVOrigin.Y(); }

24

//! 使用此方法更改纹理的原点。纹素 (0,0) 将映射到表面 (UOrigin,VOrigin)
Standard_EXPORT void SetTextureOrigin (const Standard_Boolean theToSetTextureOrigin,
const Standard_Real theUOrigin = 0.0,
const Standard_Real theVOrigin = 0.0);

25

//! @return 如果应用纹理映射的比例因子,则返回 true
Standard_Boolean TextureScale() const { return myToScale; }

26

//! @return U 坐标的比例因子(默认为 1.0)
Standard_Real TextureScaleU() const { return myUVScale.X(); }

27

//! @return V 坐标的比例因子(默认为 1.0)
Standard_Real TextureScaleV() const { return myUVScale.Y(); }

28

//! 使用此方法缩放纹理(面的百分比)。
//! 您可以为 U 和 V 分别指定一个比例因子。
//! 例如:如果将 ScaleU 和 ScaleV 设置为 0.5 并启用纹理重复,
//! 则纹理将在每个方向上在面上显示两次。
Standard_EXPORT void SetTextureScale (const Standard_Boolean theToSetTextureScale,
const Standard_Real theScaleU = 1.0,
const Standard_Real theScaleV = 1.0);

29

//! @return 如果请求显示三角形,则返回 true
Standard_Boolean ShowTriangles() const { return myToShowTriangles; }

30

//! 使用此方法显示形状的三角化(用于调试等)。
Standard_EXPORT void ShowTriangles (const Standard_Boolean theToShowTriangles);

31

//! @return 如果启用了纹理颜色调制,则返回 true
Standard_Boolean TextureModulate() const { return myModulate; }

32

//! 如果支持指定的显示模式(扩展 AIS_Shape 的显示模式 3),则返回 true。
virtual Standard_Boolean AcceptDisplayMode (const Standard_Integer theMode) const Standard_OVERRIDE { return theMode >= 0 && theMode <= 3; }

用法用例

OpenCascade中的AIS_TexturedShape类用于在形状上应用纹理,以下是一个简单的用法示例:

#include <AIS_TexturedShape.hxx>
#include <Graphic3d_AspectFillArea3d.hxx>
#include <TopoDS.hxx>
#include <TopExp_Explorer.hxx>
#include <BRep_Builder.hxx>
#include <BRepPrimAPI_MakeBox.hxx>
#include <AIS_InteractiveContext.hxx>
#include <Quantity_Color.hxx>
#include <Aspect_TypeOfFacingModel.hxx>

void createTexturedShape(const Handle(AIS_InteractiveContext)& context) {
    // 创建一个长方体作为示例形状
    BRep_Builder builder;
    TopoDS_Shape shape;
    BRepPrimAPI_MakeBox box(gp_Pnt(-50, -50, -50), gp_Pnt(50, 50, 50));
    shape = box.Shape();

    // 创建AIS_TexturedShape对象
    Handle(AIS_TexturedShape) texturedShape = new AIS_TexturedShape(shape);

    // 设置纹理文件(示例使用路径指定纹理图像)
    texturedShape->SetTextureFileName("path/to/texture.png");

    // 设置纹理映射属性
    texturedShape->SetTextureMapOn();
    texturedShape->SetTextureRepeat(true, 2.0, 1.0);  // 设置纹理在 U 方向重复两次,在 V 方向重复一次
    texturedShape->SetTextureScale(true, 0.5, 0.5);   // 缩放纹理大小为原来的一半

    // 将AIS_TexturedShape添加到交互上下文中显示
    context->Display(texturedShape, Standard_True);
}

int main() {
    // 创建OpenCascade交互上下文
    Handle(AIS_InteractiveContext) context = new AIS_InteractiveContext();

    // 创建带纹理的形状并显示
    createTexturedShape(context);

    // 进入主事件循环或其他逻辑...
    
    return 0;
}

在上述示例中,我们首先创建了一个简单的长方体形状,并将其作为示例形状。然后,我们创建了一个AIS_TexturedShape对象,并设置了纹理文件的路径,以及纹理的映射属性,包括重复次数和缩放因子。最后,我们将AIS_TexturedShape对象添加到交互上下文中显示。这个示例展示了如何使用AIS_TexturedShape类在OpenCascade中创建和显示带纹理的形状。

参考

posted @ 2024-08-01 19:55  一点灯  阅读(0)  评论(0编辑  收藏  举报  来源