opencascade AIS_ViewCube源码学习小方块

news2024/9/20 10:41:19

opencascade AIS_ViewCube 小方块
在这里插入图片描述

前言

用于显示视图操控立方体的交互对象。
视图立方体由多个部分组成,负责不同的相机操作:
立方体的各个面代表主视图:顶部、底部、左侧、右侧、前侧和后侧。
边表示主视图之一的旋转45度。
顶点表示主视图之一的两个方向的旋转。
该对象的行为类似于视图角落的三轴坐标系,
因此其位置应该使用转换持久性标志进行定义:
@code SetTransformPersistence (new Graphic3d_TransformPers (Graphic3d_TMF_TriedronPers, Aspect_TOTP_LEFT_LOWER, Graphic3d_Vec2i (100, 100));
视图立方体的各部分对于检测或动态高亮显示是敏感的(但不是选择),并且每个其所有者 AIS_ViewCubeOwner 对应于相机的变换。
for (aViewCube->StartAnimation (aDetectedOwner); aViewCube->HasAnimation(); )
{
aViewCube->UpdateAnimation();
… // 更新应用程序窗口
}

包括变换循环。
此循环允许外部操作,例如应用程序更新。为此,AIS_ViewCube 在应用程序级别上具有虚拟接口 onAfterAnimation(),应在此重新定义。

在这里插入图片描述

方法

//! 如果指定的方向属于立方体的一个面,则返回TRUE。

bool IsBoxSide (V3d_TypeOfOrientation theOrient);

//! 如果指定的方向属于立方体的一个边,则返回TRUE。

bool IsBoxEdge (V3d_TypeOfOrientation theOrient);

//! 如果指定的方向属于立方体的一个角(顶点),则返回TRUE。

bool IsBoxCorner (V3d_TypeOfOrientation theOrient);

//! 空构造函数。

AIS_ViewCube();

//! 返回视图动画。

const Handle(AIS_AnimationCamera)& ViewAnimation() const { return myViewAnimation; }

//! 设置视图动画。

SetViewAnimation (const Handle(AIS_AnimationCamera)& theAnimation) { myViewAnimation = theAnimation; }

//! 如果启用自动在选择(高亮)时进行相机转换,则返回TRUE;默认为TRUE。

ToAutoStartAnimation() const { return myToAutoStartAnim; }

//! 启用/禁用选择(高亮)时的自动相机转换。
//! 如果应用程序希望根据拾取结果(AIS_ViewCubeOwner)手动执行操作,则可以禁用自动逻辑。

void SetAutoStartAnimation (bool theToEnable) { myToAutoStartAnim = theToEnable; }

//! 如果相机动画应在不间断循环中进行,则返回TRUE;默认为TRUE。

Standard_Boolean IsFixedAnimationLoop() const { return myIsFixedAnimation; }

//! 设置相机动画是否应在不间断循环中进行。

void SetFixedAnimationLoop (bool theToEnable) { myIsFixedAnimation = theToEnable; }

//! 它不会重置视图立方体的位置。

void ResetStyles();

设置默认的可视属性。

void setDefaultAttributes();

//! 设置默认的动态高亮属性。

void setDefaultHighlightAttributes();

几何管理API
//! @return 视图立方体面的大小(宽度和高度);默认为100。

Standard_Real Size() ;

//! 设置视图立方体面的大小(宽度和高度)。
//! theToAdaptAnother 如果为TRUE,则将自动调整其他参数以适应指定的大小。

void SetSize (Standard_Real theValue,Standard_Boolean theToAdaptAnother = true);

//! 返回盒子面到边/角面分割的盒子面扩展;默认为10。

Standard_Real BoxFacetExtension() ;

//! 设置盒子面扩展的新值。

void SetBoxFacetExtension (Standard_Real theValue);

//! 返回轴与3D部分(盒子)之间的间距;默认为10。

Standard_Real AxesPadding() const { return myAxesPadding; }

//! 设置轴与3D部分(盒子)之间的新间距值。

void SetAxesPadding (Standard_Real theValue);

//! 返回盒子边缘与盒子面之间的间隙;默认为0。

Standard_Real BoxEdgeGap() const { return myBoxEdgeGap; }

//! 设置盒子边缘间隙的新值。

void SetBoxEdgeGap (Standard_Real theValue);

//! 返回盒子边缘的最小大小;默认为2。

Standard_Real BoxEdgeMinSize() const { return myBoxEdgeMinSize; }

//! 设置盒子边缘的最小大小的新值。

void SetBoxEdgeMinSize (Standard_Real theValue);

//! 返回盒子角(顶点)的最小大小;默认为2。

Standard_Real BoxCornerMinSize() const { return myCornerMinSize; }

//! 设置盒子角(顶点)的最小大小的新值。

void SetBoxCornerMinSize (Standard_Real theValue);

//! 返回视图立方体边角(圆角矩形)的相对半径;默认为0.0。
//! 该值在[0, 0.5]范围内,意味着绝对半径=RoundRadius() / Size()。

Standard_Real RoundRadius() ;

//! 设置视图立方体边角(圆角矩形)的相对半径。

该值应在[0, 0.5]范围内。
Standard_EXPORT void SetRoundRadius ;

//! 返回三轴的半径;默认为1.0。

Standard_Real AxesRadius() ;

//! 设置三轴的半径。

void SetAxesRadius (const Standard_Real theRadius);

//! 返回三轴圆锥的半径;默认为3.0。

Standard_Real AxesConeRadius() ;

//! 设置三轴圆锥的半径。

void SetAxesConeRadius (Standard_Real theRadius);

//! 返回三轴球(中心点)的半径;默认为4.0。

Standard_Real AxesSphereRadius();

//! 设置三轴球(中心点)的半径。

void SetAxesSphereRadius (Standard_Real theRadius);

//! return 如果绘制三轴,则返回TRUE;默认为TRUE。

Standard_Boolean ToDrawAxes();

//! 启用/禁用绘制三轴。

void SetDrawAxes (Standard_Boolean theValue);

//! @return 如果绘制视图立方体的边缘,则返回TRUE;默认为TRUE。

Standard_Boolean ToDrawEdges() ;

//! 启用/禁用绘制视图立方体的边缘。

void SetDrawEdges (Standard_Boolean theValue);

//! 返回如果绘制视图立方体的顶点(角),则返回TRUE;默认为TRUE。

Standard_Boolean ToDrawVertices() const { return myToDisplayVertices; }

//! 启用/禁用绘制视图立方体的顶点(角)。

void SetDrawVertices (Standard_Boolean theValue);

//! 如果应用程序期望Y-up视图方向而不是Z-up,则返回TRUE;默认为FALSE。

Standard_Boolean IsYup() ;

//! 设置应用程序是否期望Y-up视图方向而不是Z-up。

Standard_EXPORT void SetYup (Standard_Boolean theIsYup,
Standard_Boolean theToUpdateLabels = Standard_True);

样式管理API
//! 返回盒子面的着色样式。

const Handle(Prs3d_ShadingAspect)& BoxSideStyle();

//! 返回盒子边的显示样式。

const Handle(Prs3d_LineAspect)& BoxEdgeStyle();

//! 返回盒子角(顶点)的显示样式。

const Handle(Prs3d_PointAspect)& BoxCornerStyle() ;

//! 返回轴线的显示样式。

const Handle(Prs3d_LineAspect)& AxesStyle();

//! 返回轴线顶部圆锥的显示样式。

const Handle(Prs3d_ShadingAspect)& AxesConeStyle() ;

//! 返回轴线顶部球(中心点)的显示样式。

const Handle(Prs3d_PointAspect)& AxesSphereStyle() ;

//! 设置盒子面的着色样式。

void SetBoxSideStyle (const Handle(Prs3d_ShadingAspect)& theAspect);

//! 设置盒子边的显示样式。

void SetBoxEdgeStyle (const Handle(Prs3d_LineAspect)& theAspect);

//! 设置盒子角(顶点)的显示样式。

void SetBoxCornerStyle (const Handle(Prs3d_PointAspect)& theAspect);

//! 设置轴线的显示样式。

void SetAxesStyle (const Handle(Prs3d_LineAspect)& theAspect);

//! 设置轴线顶部圆锥的显示样式。

void SetAxesConeStyle (const Handle(Prs3d_ShadingAspect)& theAspect);

//! 设置轴线顶部球(中心点)的显示样式。

void SetAxesSphereStyle (const Handle(Prs3d_PointAspect)& theAspect);

public: //! @name 显示属性管理API

//! 返回视图立方体的可见性。

Standard_Boolean IsVisible() ;

//! 设置视图立方体的可见性。

Standard_EXPORT void SetVisible (Standard_Boolean theToDisplay);

//! @return 返回三轴的可见性。

Standard_Boolean AreAxesVisible() const { return myToDisplayAxes; }

//! 设置三轴的可见性。

Standard_EXPORT void SetAxesVisible (Standard_Boolean theToDisplay);

//! @return 返回视图立方体的边的可见性。

Standard_Boolean AreEdgesVisible() const { return myToDisplayEdges; }

//! 设置视图立方体的边的可见性。

Standard_EXPORT void SetEdgesVisible (Standard_Boolean theToDisplay);

//! @return 返回视图立方体的顶点(角)的可见性。

Standard_Boolean AreVerticesVisible() const { return myToDisplayVertices; }

//! 设置视图立方体的顶点(角)的可见性。

Standard_EXPORT void SetVerticesVisible (Standard_Boolean theToDisplay);

//! 返回视图立方体的标签是否可见。

Standard_Boolean AreLabelsVisible() const { return myToDisplayLabels; }

//! 设置视图立方体的标签是否可见。

Standard_EXPORT void SetLabelsVisible (Standard_Boolean theToDisplay);

标签管理API
//! 返回盒子面的标签的文本样式。

const Handle(Graphic3d_AspectText3d)& BoxSideTextStyle() const { return myTextStyle; }

//! 返回盒子边的标签的文本样式。

const Handle(Graphic3d_AspectText3d)& BoxEdgeTextStyle() const { return myTextStyle; }

//! 返回盒子角(顶点)的标签的文本样式。

const Handle(Graphic3d_AspectText3d)& BoxCornerTextStyle() const { return myTextStyle; }

//! 设置盒子面的标签的文本样式。

void SetBoxSideTextStyle (const Handle(Graphic3d_AspectText3d)& theAspect);

//! 设置盒子边的标签的文本样式。

void SetBoxEdgeTextStyle (const Handle(Graphic3d_AspectText3d)& theAspect);

//! 设置盒子角(顶点)的标签的文本样式。

void SetBoxCornerTextStyle (const Handle(Graphic3d_AspectText3d)& theAspect);

交互API
//! 返回当前视图立方体拾取的面。

AIS_ViewCubeOwner PickedOwner() const { return myPickedOwner; }

//! 返回是否可以拾取视图立方体。

Standard_Boolean IsPickable() const { return myIsPickable; }

//! 设置是否可以拾取视图立方体。

void SetPickable (Standard_Boolean theIsPickable) { myIsPickable = theIsPickable; }

//! 返回拾取动作是否启用。

Standard_Boolean IsPickActionEnabled();

//! 启用/禁用拾取动作。

void SetPickActionEnabled (Standard_Boolean theToEnable) { myToEnablePickAction = theToEnable; }

//! 返回当前视图立方体面的方向。

如果视图立方体未拾取,则返回-1。
Standard_Integer PickedOrientation();

//! 返回视图立方体面的方向的角度。

Standard_Real PickedOrientationAngle();

//! @return 返回拾取到视图立方体的面的位置(UV参数范围为[0,1])。

gp_XY PickedLocation() ;

//! 返回视图立方体的拾取偏移量。

gp_XY PickShift() ;

//! 设置视图立方体的拾取偏移量。

void SetPickShift (const gp_XY& theShift) { myPickShift = theShift; }

//! 返回视图立方体拾取的边框面的偏移量。

Standard_Real BoxFacetPickShift() ;

//! 设置视图立方体拾取的边框面的偏移量。

void SetBoxFacetPickShift (Standard_Real theShift);

//! 返回视图立方体拾取的边框边的偏移量。

Standard_Real BoxEdgePickShift() ;

//! 设置视图立方体拾取的边框边的偏移量。

void SetBoxEdgePickShift (Standard_Real theShift);

//! 返回视图立方体拾取的角的偏移量。

Standard_Real BoxCornerPickShift();

//! 设置视图立方体拾取的角的偏移量。

void SetBoxCornerPickShift (Standard_Real theShift);

操作API
//! 将视图立方体放置到指定的视图和位置。

void Place (const Handle(V3d_View)& theView,
const AIS_ViewCubeLocation theLocation);

//! 将视图立方体放置到视图的默认位置。

void Place (const Handle(V3d_View)& theView);

//! 设置视图立方体的方向(面)。

void SetOrientation (const V3d_TypeOfOrientation theOrientation);

//! 设置视图立方体的位置。

void SetLocation (const AIS_ViewCubeLocation theLocation);

//! 设置视图立方体的位置和方向。

void SetPosition (const AIS_ViewCubeLocation theLocation,
const V3d_TypeOfOrientation theOrientation);

//! 将视图立方体放置到视图的默认位置和方向。

Standard_EXPORT void SetPosition (const Handle(V3d_View)& theView,
const AIS_ViewCubeLocation theLocation,
const V3d_TypeOfOrientation theOrientation);

返回视图立方体的当前位置。
Standard_EXPORT AIS_ViewCubeLocation currentLocation() const;

//! 返回指定的方向(面)。

Standard_EXPORT V3d_TypeOfOrientation orientationOf (const AIS_ViewCubeLocation theLocation) const;

使用方法

在OpenCASCADE中,AIS_ViewCube是一个用于显示视图立方体(View Cube)的类,它提供了一个三维视图中用于导航的交互性控件。下面是一个简单的示例代码,展示如何在OpenCASCADE中使用AIS_ViewCube类:

#include <AIS_ViewCube.hxx>
#include <V3d_View.hxx>
#include <Graphic3d_AspectText3d.hxx>
#include <Prs3d_Drawer.hxx>
#include <Graphic3d_AspectLine3d.hxx>
#include <Graphic3d_AspectMarker3d.hxx>
#include <Graphic3d_AspectText3d.hxx>
#include <Prs3d_LineAspect.hxx>
#include <Prs3d_PointAspect.hxx>
#include <Prs3d_ShadingAspect.hxx>
#include <Prs3d_TextAspect.hxx>
#include <TCollection_AsciiString.hxx>
#include <OpenGl_GraphicDriver.hxx>
#include <V3d_Viewer.hxx>
#include <AIS_InteractiveContext.hxx>

// 创建视图立方体并显示在指定的视图中
void createAndDisplayViewCube(const Handle(V3d_View)& view)
{
    // 创建视图立方体
    Handle(AIS_ViewCube) viewCube = new AIS_ViewCube();
    
    // 设置视图立方体的位置(这里选择了默认位置)
    viewCube->Place(view);
    
    // 设置视图立方体的方向(这里选择了默认方向)
    viewCube->SetOrientation(V3d_XposYnegZpos);

    // 设置视图立方体的可见性(默认可见)
    viewCube->SetVisible(Standard_True);
    
    // 将视图立方体添加到交互式上下文中
    Handle(AIS_InteractiveContext) context = view->Viewer()->InteractiveContext();
    context->Display(viewCube, Standard_True);
}

int main()
{
    // 初始化OpenCASCADE图形驱动
    Handle(OpenGl_GraphicDriver) graphicDriver = new OpenGl_GraphicDriver();
    
    // 创建视图
    Handle(V3d_Viewer) viewer = new V3d_Viewer(graphicDriver);
    Handle(V3d_View) view = viewer->CreateView();
    
    // 将视图显示在窗口中(这里省略窗口创建和初始化的代码)
    
    // 创建和显示视图立方体
    createAndDisplayViewCube(view);
    
    // 运行主事件循环等待用户操作(这里省略事件循环的代码)
    
    return 0;
}

代码解析:

  1. 头文件包含:

    • #include <AIS_ViewCube.hxx>:引入AIS_ViewCube类的头文件。
    • 其他头文件用于引入所需的OpenCASCADE类和数据类型。
  2. createAndDisplayViewCube函数:

    • createAndDisplayViewCube函数用于创建和显示视图立方体。
    • 创建AIS_ViewCube对象,并设置其位置和方向。
    • AIS_ViewCube添加到交互式上下文中,以便在视图中显示。
  3. 主函数main:

    • 创建OpenCASCADE图形驱动和视图对象。
    • 创建和显示视图立方体,调用createAndDisplayViewCube函数。
    • 主事件循环等待用户操作,这里未提供完整的事件处理代码。
  4. 注意事项:

    • 代码中省略了窗口创建和事件循环等部分,这些通常需要根据具体的应用程序环境来实现。
    • 在实际应用中,还可以根据需求调整视图立方体的其他属性,如样式、标签等。

这段示例代码演示了如何在OpenCASCADE中创建和显示一个基本的视图立方体控件。

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1974552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3143. 正方形中的最多点数 Medium

给你一个二维数组 points 和一个字符串 s &#xff0c;其中 points[i] 表示第 i 个点的坐标&#xff0c;s[i] 表示第 i 个点的 标签 。 如果一个正方形的中心在 (0, 0) &#xff0c;所有边都平行于坐标轴&#xff0c;且正方形内 不 存在标签相同的两个点&#xff0c;那么我们称…

ChatGPT协助撰写研究论文的11种方法【全集】

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 当我们使用 ChatGPT 时&#xff0c;原本那些需要花费数小时、数天、有时甚至更长时间的任务现在只需几分钟甚至更短时间。 今天的分享&#xff0c;我们将谈谈 ChatGPT 在研究论文方面可…

右键空白处自定义菜单

效果 建立二级菜单 winr输入 regedit 路径复制到地址栏&#xff0c;回车即可定位。 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\如果没有地址栏 在shell上右键&#xff0c;新建项,名字随意但最好是英文&#xff08;…

免费开源!PDF加盖骑缝章小工具PDFQFZ

PDFQFZ是一款免费开源的PDF加盖骑缝章小工具&#xff0c;主要用于给多页合同等PDF文件添加骑缝章&#xff0c;以达到防伪效果。该工具支持对PDF文件或文件夹进行随机分割、印章设定、骑缝章等操作&#xff0c;生成加盖骑缝章的PDF文件。 主要功能&#xff1a; 支持加密PDF文件…

Python安装教程(Window环境)

1 Python安装 1.1 Python官网下载 1&#xff09;在Python官网选择Python版本&#xff08;这里选择Python 3.12.4&#xff09;&#xff0c;点击对应的【Download】按钮下载。2&#xff09;根电脑的操作系统类型选择&#xff08;这里电脑64位操作系统&#xff09;&#xff0c;点…

【商品支付】漏洞详解!

产生原因&#xff1a; 订单金额的验证:价格未保存在数据库中未校验商品价格与数据库中是否匹配 不安全的传输&#xff1a; 订单相关信息未进行加密传输(话说你加密的地方一定是重要地方&#xff0c;你不加密&#xff0c;你就是有病&#xff0c;哈哈哈) 验证规…

(超全)Kubernetes 的核心组件解析

引言 在现代软件开发和运维的世界中&#xff0c;容器化技术已经成为一种标志性的解决方案&#xff0c;它为应用的构建、部署和管理提供了前所未有的灵活性和效率。然而&#xff0c;随着应用规模的扩大和复杂性的增加&#xff0c;单纯依靠容器本身来管理这些应用和服务已不再足够…

gitlab 服务器安装

阿里云盘快传 百度链接 链接&#xff1a;https://pan.baidu.com/s/1Gn5bWHi45Dcpe1RH1S06dw 提取码&#xff1a;yai2 然后就是有一台服务器 cd /mkdir gitlab上传下载好的东西rpm -ivh gitlab-ce-10.8.4-ce.0.el7.x86_64.rpm 这里可以tab提示vim /etc/gitlab/gitlab.rb我建议…

【JavaEE精炼宝库】 网络编程套接字——UDP业务逻辑 | TCP流套接字编程及业务逻辑实现

文章目录 一、UDP业务逻辑实现二、TCP流套接字编程2.1 API 介绍&#xff1a;2.1.1 ServerSocket&#xff1a;2.1.2 Socket&#xff1a; 2.2 Java流套接字通信模型&#xff1a;2.3 代码示例&#xff1a;2.3.1 TCP Echo Server&#xff1a;2.3.2 TCP Echo Client&#xff1a;2.3.…

【刷题汇总 -- 爱吃素、相差不超过k的最多数、最长公共子序列(一)】

C日常刷题积累 今日刷题汇总 - day0261、爱吃素1.1、题目1.2、思路1.3、程序实现 2、相差不超过k的最多数2.1、题目2.2、思路2.3、程序实现 -- 滑动窗口 3、最长公共子序列(一)3.1、题目3.2、思路3.3、程序实现 -- dp 4、题目链接 今日刷题汇总 - day026 1、爱吃素 1.1、题目…

自写Json转换工具

前面写了简单的API测试工具ApiTools&#xff0c;返回的json有时需要做很多转换&#xff0c;于是开发了这个工具。 功能包括 1、json字符串转为表格&#xff0c;可以直观的展示&#xff0c;也可以复制&#xff0c;并支持转换后的表格点击列头进行排序&#xff0c;比较方便地定…

鸿蒙系统开发【应用接续】基本功能

应用接续 介绍 基于ArkTS扩展的声明式开发范式编程语言编写的一个分布式视频播放器&#xff0c;主要包括一个直播视频播放界面&#xff0c;实现视频播放时可以从一台设备迁移到另一台设备继续运行&#xff0c;来选择更合适的设备继续执行播放功能以及PAD视频播放时协同调用手…

怎么选择的开放式耳机好用?2024超值耳机分享!

耳机在当前数字化时代已成为我们生活、娱乐乃至工作中的重要部分。随着市场需求的增长&#xff0c;消费者对耳机的期望也在提高&#xff0c;他们不仅追求音质的卓越&#xff0c;还关注佩戴的舒适度和外观设计。虽然传统的入耳式和半入耳式耳机在音质上往往能够满足人们&#xf…

JavaFX布局-Accordion

JavaFX布局-Accordion 一个可扩展的面板&#xff0c;包括标题、内容与TitledPane配合一起使用 public static Accordion demo1() {// 创建AccordionAccordion accordion new Accordion();// 内边距accordion.setPadding(new Insets(10, 10, 10, 10));for (int i 1; i < 1…

PSINS工具箱函数介绍——avperrset

目录 avperrset是设置avp误差的函数使用方法函数源代码源代码解析 avperrset是设置avp误差的函数 输入为角度误差、速度误差、位置误差。 输出也是角度误差、速度误差、位置误差。 看起来输入和输出都一样&#xff0c;为什么还要这个函数呢&#xff1f; 那是因为这个函数可以进…

计算机网络-PIM-DM密集模式工作原理

一、PIM-DM基础概念 PIM-DM主要用在组成员较少且相对密集的网络中&#xff0c;通过"扩散-剪枝"的方式形成组播转发树&#xff08;SPT&#xff09;。 PIM-DM在形成SPT的过程中&#xff0c;除了扩散&#xff08;Flooding&#xff09;&#xff0c;剪枝&#xff08;Prune…

基于YOLOv10的裂缝检测系统

基于YOLOv10的裂缝检测系统 (价格80) 包含 【裂缝】 1个类 通过PYQT构建UI界面&#xff0c;包含图片检测&#xff0c;视频检测&#xff0c;摄像头实时检测。 &#xff08;该系统可以根据数据训练出的yolov10的权重文件&#xff0c;运用在其他检测系统上&#xff0c;如火…

Logic Error: 如何识别和修复逻辑错误

&#x1f9e9; Logic Error: 如何识别和修复逻辑错误 &#x1f50d; &#x1f9e9; Logic Error: 如何识别和修复逻辑错误 &#x1f50d;摘要引言正文内容一、什么是逻辑错误&#xff1f; &#x1f914;1.1 逻辑错误的定义1.2 逻辑错误的特征 二、常见的逻辑错误类型 &#x1f…

深度洞察·情感保鲜与经济可持续的共鸣——解锁情感与品牌长青的密码

深度洞察情感保鲜与经济可持续的共鸣——解锁情感与品牌长青的密码 在这个快节奏的时代&#xff0c;我们常常在探寻&#xff0c;为何曾经那份心动的激情会逐渐褪色&#xff0c;如同你我点解&#xff0c;两人并肩却渐失“feel”&#xff0c;想要转身离去&#xff1f;或许&#…

分享5款ai头像工具,助你轻松实现社交新形象

如今&#xff0c;无论是社交媒体上的个人形象塑造&#xff0c;还是虚拟世界中的角色扮演&#xff0c;一个独特而吸引人的AI头像都能成为你个性化的代表。 例如&#xff0c;ai头像男古风通常代表着一种对传统文化的尊重和热爱&#xff1b;而现代简约头像可能代表着一种追求简洁…