关于单个模型切片

本文详细介绍了3D模型切片的过程,包括切片的目的、如何进行切片、输出内容、各层级设置、如何找模型的三角面、八叉树的结束条件、叶子节点的设置以及加载方法。此外,还提到了纹理处理和加载根文件即可实现模型的完整加载。

这几天鼓捣了模型切片,遇到好多坑。特此记录。

1,切片切什么?

切的是模型,模型可以通过Nodevisitor转换为geode,而geode可以分为若干drawable,切的就是这些drawable。因此,要node->accept(visitor),在void apply(geode)里面写

如果是多个模型,则切的是整体空间,

2,如何切

这些drawable可以分为geometry,按照包围盒四叉树或者八叉树分。最后一级为geode,其余各级是PagedLod。

可以每个drawable一个文件夹,也可以按照总的包围盒把每个级别放到一个文件夹。

3,输出什么?

根据递归,生成一个group,group->addchild()各下层,不输出叶子节点。即只生成writeNode(group,theFileName),四叉树有4个孩子,八叉树有8个孩子。

不输出叶子节点的原因是,假设第n层是叶子节点,已经在n-1层的group里面写了。

4,各层Pagelod如何设置

本质是离得越近,越清楚,

如果中心模式是像素模式,则要把setrange设为大于某阈值,即pagedLod->setRange(0,阈值,无穷大或某个很大的值)因为越近像素才大;

同样,如果中心模式为离视点模式,则setrange设为(0,0,阈值)。

即,离视点越近,像素越大,所以这两种模式的阈值范围要相反。

第一个参数设置为0,是假设这个pagedLod->setFileName(0,theFileName) 这个theFiledName是本级的输出文件名称。由于是级别之间环环相扣,所以是相对路径。毕竟,这些切片要放在任意电脑的任意位置。

即,可以输出文件的本级是一个pagedLod,本级输出文件是一个group,

5,如何找模型的三角面。

感谢博主@MeteorChenBo,链接在https://blog.youkuaiyun.com/qq_31709249/article/details/94357183

对点和三角形的关系,索引缓冲区查找,写的很清楚。但是纹理坐标不对。只能用索引缓冲区。

6,八叉树何时结束,

参照osgCookbook,其实就是一个递归。直到某个最大级数,或者包围盒大小不超过某个阈值,或者包围盒内的三角形个数不超过一个阈值,此时递归结束。

当然,也可以自定义任何可以收敛的条件,总之,不能无限递归下去。

7,叶子节点如何设置

判断该三角形中心点是否在包围盒,把在该包围盒里的三角面数组用triangles模式,组成geode

8,如何加载

直接用osg::ref_ptr<osg;:Node> node = osgDB::readNode(第0级根文件),root->addChild(node)即可。

9,纹理问题

模型是有纹理的,这个在apply(StateSet)里写,

每个Stateset里包含texture,texture又和Image相关,从image里,又可以获取图片名称,从osg低版本源码上看,每个Image只有一个图片,

总之,

各层是环环相扣的。因为在pagelod->setFileName()中已经写好了所以只要加载根文件即可。

### 文本切片在大型语言模型中的实现方式 在大型语言模型(LLM)的应用场景中,文本切片是一个至关重要的预处理步骤。特别是在 RAG(Retrieval-Augmented Generation)架构中,为了构建高效的向量数据库,需要对包含丰富知识的长文本进行合理的切分。切分后的文本块通过向量化模型处理后存入数据库,以便后续的检索和生成任务使用。 文本切片的方式通常包括基于固定长度的分块(chunking)和重叠(overlap)机制。具体来说,文本可以按照设定的 `chunk_size`(如 512 个 token)进行分块,并使用 `chunk_overlap` 参数控制相邻块之间的重叠部分。这种设计类似于阅读时向前回顾一部分内容,有助于保持上下文的连贯性,特别是在没有记忆能力的模型中,这种重叠机制可以显著提升模型对上下文的理解能力[^2]。 ### 文本切片的关键参数与影响 - **chunk_size**:决定每个文本块的最大长度。如果设置过长,可能会导致向量数据库中的信息密度降低,同时增加模型处理单个块的计算成本。此外,长文本块可能包含过多不相关的上下文,影响检索的准确性[^1]。 - **chunk_overlap**:控制相邻文本块之间的重叠程度。通过设置适当的重叠范围(如 64 个 token),可以在不同块之间保留上下文信息,避免因分块导致的语义断裂。 - **分割方式**:除了基于 token 的固定长度切分,还可以根据语义边界(如段落、句子)进行切分,以保留语义完整性。这种方式在处理结构化文本时尤为有效。 ### 文本切片的实现示例 以下是一个使用 Python 实现的简单文本切片函数,模拟了基于 chunk 和 overlap 的文本分块逻辑: ```python def chunk_text(text, chunk_size=512, overlap=64): """ 将文本按照指定的块大小和重叠大小进行切分 :param text: 输入文本 :param chunk_size: 每个块的大小 :param overlap: 块之间的重叠大小 :return: 切分后的文本块列表 """ words = text.split() chunks = [] start = 0 while start < len(words): end = start + chunk_size chunk = " ".join(words[start:end]) chunks.append(chunk) start += chunk_size - overlap return chunks # 示例文本 text = " ".join(["示例"] * 1000) # 生成一个重复的长文本 # 切分文本 chunks = chunk_text(text, chunk_size=512, overlap=64) print(f"总共有 {len(chunks)} 个文本块") ``` 该函数将文本按照单词进行切分,并在每个块之间保留一定的重叠内容。这种方式适用于大多数基于 token 的语言模型输入格式。 ### 多模态场景下的文本切片 在处理包含图片的文档时,也可以通过 OCR(光学字符识别)技术提取图像中的文本内容,并将其作为文本块进行处理。如果图像本身不包含可识别的文本,可以借助多模态大模型生成图像描述,或使用图像嵌入(如 CLIP)来构建向量表示。虽然图像处理本身不属于文本切片的范畴,但在构建统一的知识检索系统时,这些方法通常与文本切片协同使用[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值