OGRE中用到的核心对象(core objects)以及它们的用途

Python开发提效新范式:用GPT-4 Custom Instructions构建编码宪法 Custom Instructions 是大模型时代下 Python 工程规范的结构化载体,其本质是将隐性开发约定(如类型提示、错误处理、日志规范)转化为 AI 可执行、可验证、可继承的元规则。它基于 GPT-4 的指令记忆与上下文补全能力,实现跨会话一致性约束,显著降低认知负荷与风格熵增。相比临时提示词,Custom Instructions 具备账户级持久性、安全红线强制拦截、领域感知生成等技术价值,已广泛应用于 Web API、数据管道、机器学习工程等典型 Python 场景,成为现代 Python 阅读详情
 #title OGRE手册 v1.4.4('Eihort') 中文版 第二章

* 2. 核心对象

** 介绍

本教程带你快速了解将会在OGRE中用到的核心对象(core objects)以及它们的用途。

** 谈谈命名空间(namespace)

OGRE使用c++中命名空间(namespace)的特性。它可以把类(class),枚举(enum),结构(struceure)和其他东西都放在一个“命名空间”里来防止重名,也就是有两个东西同时叫做一个名字的情况。自从OGRE被设计成在其他程序内部使用,重名的问题就必须解决。有些人的解决方法是在类/类型(type)前面标上短前缀,因为一些编译器不支持命名空间。最后我还是选择了使用命名空间,因为我觉着这样比较正规。假如你有个不太标准的编译器的话那就对不住了,其实c++标准已经发布了有些年头,所以那些编译器的作者们就别找借口了。如果你的编译器还不支持命名空间的话,那只能说是实在太XXX了,换个好的吧。;) 这意味着每个类,类型等等前面都会被加上'Ogre::',例如:'Ogre::Camera', 'Ogre::Vector3'等,你在自己的程序中使用诸如Vector3这样的类型就不会重名了。为避免大量额外的打字,你可以在你的代码里加上'using namespace Ogre;'这条语句,这样就不用在前面打'Ogre::'了,除非碰到含糊定义(就是有相同命名的另外一处定义)的情况。

** 站得高,看得远

下面的图显示了一些核心对象及它们在大示意图中的“位子”。这绝对不是全部的类,只是在大量有效的类中用小小的一部分来说明它是如何联系在一起的。




图的最顶部是Root对象。这相当于OGRE系统的“入口”,也是用来建立待处理的高级对象(top-level objects)的地方,例如场景管理器(scene managers)、绘制系统(rendering systems)和绘制窗口(render windows)、插件加载系统(loading plugins)等基本元素。如果你实在摸不着门道,Root基本就是全部的东西了,虽然通常它只是给你另外一个做具体细节工作的对象,就好比Root本身是个组织者和服务商一样。OGRE剩下类的大部分属于下面的3种角色:

场景管理

这些关系到你场景中的内容如何被建立,如何通过摄像机观察等等。在这方面会提供一个自然描述接口来供你建造你的天地。也就是,你不用告诉OGRE“如此这般设置绘制状态,然后画3个三角形”,你可以这样说:“我要在这里放个东西,这里和这里,它们用这些材质,从这个视图开始画”,然后就是这样。

资源管理

所有的绘制都需要资源,不论是几何体,纹理,字体还是什么。小心仔细地载入,重用,卸载这些资源非常重要,所以这也就是这个方面的类要做的事情。

渲染

最后,这些画面被显示在屏幕上-这些都是有关于低端渲染流水线,供特定的绘制系统的API调用的对象,比如缓存,绘制状态这样的东西,然后送入流水线。场景管理子系统中的类用这来在屏幕上构造它们更高级别的场景信息。

你可能注意到四周角落散落着一些插件。OGRE的设计是可扩展的,插件是一种常用的扩展方式。OGRE中的很多类可以被继承以及扩展,比如可以更换定制的场景管理器来管理场景,添加新的绘制系统的实现(比如Direct3D或是OpenGL),或者提供一种方式从其他源上来获取资源(比如从网页或者是数据库)。这些只是插件能做的少数的这类活,但是你可以在系统的方方面面运用插件。这么说,OGRE不仅仅是个针对狭义问题的解决方案,它可以扩展到你想要做的任意事情。


** 2.1 Root对象

Root对象是OGRE系统的入口点。这个对象必须第一个创建,最后一个销毁。在示例程序中,我在程序对象中建立了一个Root的实例作为成员,保证它在程序对象建立的时候马上建立,在程序对象删除的时候马上删除。

root对象允许你配置系统,举例来说,通过showConfigDialog()方法,可以完全手动检测所有绘制系统的选项,并显示一个对话框供用户定制解析度,颜色深度,全屏选项等。它同时也会把用户的选择记录下来,这样以后就可以直接初始化系统了。

root对象也是你在系统中获取其他对象指针的好办法,如SceneManager, RenderSystem和许多其他的资源管理器。细节请阅读后面章节。

最后,如果你在连续绘制模式(continuous rendering mode)下,也就是说,你想尽可能快地刷新所有的绘制对象(游戏(game)和演示(demo)的标准行为,不包括不是窗口工具(windowed utilities))。root对象有个叫做startRendring的方法用来进入连续绘制模式,只有在所有的绘制窗口都被关闭或者任何一个帧监听器(FrameListener)对象提出需要结束的时候才会停止下来。(帧监听器对象的细节请阅读后面章节)


** 2.2 RenderSystem对象

RenderSystem对象实际上就是为后面的3D API定义的一个抽象类接口。它负责把渲染操作发送给API并设置所有的渲染选项。这个类是抽象类,因为所有的实现都由具体的绘制系统指定-每种绘制API对应一种指定的子类(例如D3DRenderSystem就是采用Dirext3D)。当系统通过Root::initialise函数初始化之后,可以通过Root::getRenderSystem()方法获取指定绘制API的RenderSystem对象。

不过,按理说一个典型的程序一般不需要直接操作RenderSystem对象,在渲染物体的时候你要做的就是指定场景管理器、材质和场景相关类的设置。只有你在创建多个绘制窗口(这种情况是指完全分离的窗口,不是多视口像分割屏幕特效那样可以通过一个RenderWindow类搞定)或者是要设置一些高级特性的时候你需要直接访问RenderSystem对象。

基于这个原因,在本教程中我不会讨论RenderSystem对象的特性。你可以假设场景管理器会在合适的时机调用RenderSystem。

** 2.3 SceneManager对象

除了Root对象,从程序的角度来看这应该是系统最主要的部分了。当然,它也是程序中被用得最多的对象。场景管理器负责管理被引擎渲染的场景内容。它用它认为最好的不论什么技术来组织这些内容,建立并管理摄像机(cameras),可移动对象(实体(entities)),灯光和材质(物体的表面性质)和通常用来表现场景中静止部分充满静态几何体的“世界几何体”。

对场景管理器来说必须通过它在场景中建立摄像机。同样在场景中打开或关闭灯光也要通过它。你的程序中没有必要保存对象的列表,场景管理器维护了一个场景中所有对象的命名集合来供你访问,你很需要它们吧。去主文档中翻翻getCamera,getLight,getEntity等方法。

场景管理器也在该渲染场景的时候把场景发送到RenderSystem对象中。你应该不要直接调用SceneManager::_renderScene方法,不论什么时候它都会在渲染对象需要更新的时候自动被调用。

所以你和场景管理器打的大部分交道是在场景设置阶段。你可能会调用非常多的方法(可能由于一些包含了场景数据的问题)来创建你的场景。你也用你自己创建的帧监听器(FrameListener)对象在渲染的时候动态改变场景(等下会说到)。


由于不同的场景类型需要不同的算法来决定哪些物体该被送到RenderSystem中去,以获得好的渲染性能,SceneManager类被设计为可以为了不同的场景类型派生子类。默认的SceneManager对象会渲染一个场景,但是它的只会做少量或者没有场景管理功能,在大场景的时候你别指望它的性能有多好。意思就是说应该建立每种场景的特殊操作,这样在幕后子类就可以靠给定的设置来优化这些场景类型,以获得最好的性能。一个例子就是BspSceneManager,它用二叉空间分割树(Binary Space Partition tree(BSP))来优化渲染大型室内关卡。

使用OGRE的程序不必知道那个子类是可用的。程序简单地调用Root::createSceneManager(..),通过传入一个参数来决定场景类型(例如ST_GENERIC, ST_INTERIOR等)。OGRE会自动该类型下有效的SceneManager子类,如果指定的那个无效就用默认的。OGRE开发者可以在以后加入新的特定场景管理器,这样可以不用修改任何代码来优化以前没有优化的场景类型。

** 2.4 ResourceGroupManager对象

ResourceGroupManager类就像一个“集线器(hub)”一样来加载可重用的资源,如纹理和模型。在这里你可以定义你的资源组,这样就可以在你需要的时候加载或卸载。属于它的是一批可以管理独立资源的ResourceManager,就像TextureManager或者是MeshManager。在这种情况下,资源就是必须从某处载入供OGRE使用的数据集合。

ResourceManager确保资源只被加载一次,并可以在OGRE引擎中通用。它们同时也管理资源需要的内存分配。它们也会通过很多位置来寻找资源,包括多个查询路径以及压缩文件(ZIP文件)。

大多数时候你不会和资源管理器直接打交道。资源管理器在需要的时候会由OGRE的其他部分调用,例如当你要求将一个纹理加到一个材质上的时候,TextureManager会被调用。如果你愿意,你可以让特定的资源管理器直接预加载(例如你在后面要防止磁盘访问),但大多数时候让OGRE自己决定就可以了。

有件事你要做的就是告诉资源管理器哪里可以找到资源。你通过Root::getSingleton().addResourceLocation来将资料传给ResourceGroupManager。

因为在引擎中每种类型的资源管理器只有一个实例,如果你要调用它的一个引用,可以用下面的语法:

<example>
TexureManager::getSingleton().someMethod();
MeshManager::getSingleton().someMethod();
</example>

** 2.5 Mesh对象

一个网格模型对象表现了一个离散模型,一套完备的几何体,在全局范围下通常比较小。网格模型对象一般是用来表现运动物体,并不是用来做一般作为建立背景幅员辽阔的形体。

网格模型对象是一种资源,由MeshManager资源管理器管理。它们一般由OGRE特定的物体格式'.mesh'格式中读取。网格模型文件一般由建模工具导出(见4.1 导出工具)并且可以由数种网格模型工具修改(见4. Mesh工具)。

你也可以调用MeshManager::createManual方法手动创建网格模型对象。这样你可以定义你自己的几何体,这部分内容已经超出了本手册的范围。

网格模型对象是游戏世界中独立运动物体的基础,它们也被叫做Entities(实体)。

网格模型对象还可以用骨骼动画(见8.1骨骼动画)来动作。

** 2.6 实体(Eneity)

Eneity(实体)是场景中的运动物体。它可以是一辆车,一个人,一条狗,一把手里剑(译注:日本忍者的一种暗器)这类随便什么东西。唯一的假设是它不需要在游戏世界中有个固定的位置。

Eneity基于离散网格模型(Mesh),就是说几何体包括本身的描述数据,且在通常在用网格模型对象表示的世界规模下都比较小。多个Eneity可以共用一个网格模型,经常你会想在场景中建立许多个同一种类型对象。

用SceneManager::createEntity方法创建实体,给它起个名字并指定它所代表的网格模型对象(例如'muscleboundhero.mesh')。场景管理器会确保用网格模型管理器载入网格模型对象。每个网格模型对象都只会被上载一次。

只有为实体指定了一个SceneNode该实体才会被当作场景的一部分。在指定SceneNode的时候,你可以为实体指定层次复杂的方位关系。然后你可以通过修改node的位置来间接改变实体的位置。

当一个网格模型被载入时,它一般自动的带有一些定义好的材质。很可能一个网格模型附带有多个材质-不同的部位可能是不同的材料做的。从该网格模型创建的实体自动使用默认的材质。但是,你可以根据需要在每个实体基础上更改,这样你可以基于相同的网格模型创建一系列不同纹理的实体。

想搞清楚这是怎么回事,你要知道所有的网格模型对象其实是由小网格模型(SubMesh)组成的。每种仅由一种材质组成该网格模型的一部分。如果一个网格模型只有一直材质,实际上它就是一个小网格模型。

当由这种网格模型构成一个实体的时候,它有尽可能多的小实体(SubEntity)对象,每种一一对应于原网格模型中的小网格模型对象。你可以通过Entity::getSubEntity方法访问小实体对象。通过setMaterialName方法还可以在你获得一个小实体引用的时候更换它的材质。这样你就能通过更改默认材质弄出个外表奇特的实体出来。


** 2.7 材质(Materials)

材质控制场景中的物体该如何被渲染。它指定物体的基本表面属性,如颜色反射率,光亮度之类,还有当前的纹理有几层,上面是什么图像,它们之间是如何混合的,有那些特效,比如环境贴图,使用那种剔除模式,纹理如何过滤等等。

材质也可以被编程,调用SceneManager::createMaterial并调整设置,或通过运行时载入'脚本'来指定。详细请参阅'3.1 材质脚本'

基本上和形状无关的物体外观都由材质类控制。

场景管理器类管理着场景中有效的材质主列表。这个列表可以在通过程序中调用SceneManager::createMaterial或是载入一个网格模型的方式增加(它会反过来加载材质属性)。不论何时把材质加入场景管理器,它们都会以一套默认属性开始,它们在OGRE中如下定义:

- 环境光反射率(ambient reflectance) = ColourValue::White (full)
- 漫反射率(diffuse reflectance) = ColourValue::White (full)
- 镜面光反射率(specular reflectance) = ColourValue::Black (none)
- 本体光(emissive) = ColourValue::Black (none)
- 发光度(shininess)= 0 (not shiny)
- 没有贴图层(这样也就没有贴图)
- 源混合因子(SourceBlendFactor) = SBF_ONE, 目标混合因子(DestBlendFactor) = SBF_ZERO (不透明)
- 深度缓冲检测 开
- 深度缓冲写 开
- 深度缓冲比较函数 = CMPF_LESS_EQUAL
- 剔除模式 = CULL_CLOCKWISE
- 场景环境光 = ColourValue(0.5, 0.5, 0.5) (中等灰)
- 动态光源 开
- Gourad阴影模式(Gourad shading mode)
- 立体多边形模式(Solid polygon mode)
- 双线性纹理过滤

你可以调用SceneManager::getDefaultMaterialSettings()并根据返回结果自己修改设置。如果使用了网格模型的话,实体就自动的拥有了附属的材质,在载入网格模型的时候就加上它要求的材质了。你也可以定制2.6节中描述的实体所使用的材质。只要创建一个新材质,按你喜欢的样子弄好,并用SubEntity::setMaterialName()来设置到子实体中去。

** 2.8 覆盖图(Overlays)

覆盖图可以在普通场景上绘制2D或3D元素,可以构成类似平视显示系统(HUD),菜单系统,状态条等等。刷新率的静态面板就是OGRE中覆盖图的一个例子。覆盖图可以包括2D和3D部件。2D部件用来构成平视显示系统,3D部件可以用来构建驾驶舱或其他任何需要在最顶层渲染的3D物体。

可以用SceneManager::createOverlay方法创建覆盖图,或者你可以在.overlay脚本中定义。实际上后一种方法更常用,因为它更好调试(不需要重新编译代码)。注意你爱定义多少覆盖图都可以:它们开始的时候都是关闭隐藏的,你可以调用'show()'方法来显示它们。你也可以一下子显示多个覆盖图,它们的Z轴顺序(译注:也就是深度)通过Overlay::setZOrder()方法设定。

*** 建立2D部件

OverlayElement类用于抽象可以被添加到覆盖图上的2D对象。所有想被添加到覆盖图上的物件都要从该类继承。OGRE用户可以(而且是推荐)自己定义OverlayElement的子类,这样他们可以自己控制。OverlayElement的常用关键特性就是像大小,位置,基本材质名等等。子类可以扩展这些方法来获得更复杂的属性和方法。

一个主要的内置OverlayElement子类是OverlayContainer。overlayContainer就是一个overlayElement,除此之外,它还可以容纳其他的overlayElement,对它们进行组合(例如可以把它们一起移动)并提供本地坐标以便于对齐。

另外一个重要的类是OverlayManager。当一个程序想要在一个覆盖图(或者是一个容器)上增加一个2D部件的时候,就必须调用OverlayManager::createOverlayElement。想要创建的部件类型是由字符串区分的,之所以这么做是因为可以用插件来增加一个新的OverlayElement类型,而又不必特殊依赖于这些库。举个例子:比如创建一个面板(一个可以包含其他部件的矩形区),你可以这么调用:OverlayManager::getSingleton().createOverlayElement("Panel", "myNewPanel");

*** 在覆盖图中增加2D部件

只有OverlayContainer可以被直接加到覆盖图上。原因是每层的容器都要确定它内部部件的z轴顺序(ZOrder),这样当你聚集了多个容器的时候,当中的容器拥有比较高的z轴顺序,而外围的容器拥有比较低的z轴顺序,这样看起来才对。要在覆盖图中增加一个容器(比如一个面板)只要简单的调用Overlay::add2D就可以了。

如果你想要在容器中增加子部件,就调用OverlayContainer::addChild。子部件本身只能是OverlayElement或OverlayContainer的实例。记住,子部件的位置是从其父对象的左上角开始算的。

*** 谈谈2D坐标

OGRE对放置和度量物品支持2种坐标系:相对坐标系和点坐标系。

点坐标系

当你想要为覆盖图中的物品指定个实际的大小时,这种模式非常有帮助,这样你就不必担心你在增加屏幕分辨率的时候这些物品会变小了(不过你可能要的就是这种效果)。这种模式下,让东西在任何分辨率的屏幕上居中,靠右或是靠底只有靠对齐选项。而相对坐标模式下只要使用右边的相对坐标就可以了。这种模式非常简单,屏幕的做上架是(0,0),而屏幕的右下角依靠分辨率而定。如上所示,你可以用对齐选项来确保水平和垂直的坐标对齐于右,下或是屏幕中心,而不必知道具体的分辨率就可以把像素级的东西放过去。

相对坐标系

如果你想要东西在不同的分辨率下保持一样的大小的话,这种模式就适合你。在这种模式下,左上坐标为(0,0),右下为(1,1)。你把一个东西放在(0.5,0.5)的位置上,它的左上角就在屏幕的中心,不论程序运行时的分辨率是多少。在大小上也是同样道理,如果你设置一个部件的宽是0.5,那么它就会覆盖屏幕宽度的一般。注意由于屏幕的宽高比一般为1.333:1(宽:高),故而一个(0.25,0.25)的东西可能不是个方的,但它确实会占掉屏幕面积的1/16。如果你需要一个看起来是方的东西,那你就要估摸着按照标准宽高比用(0.1875,0.25)了。

译注:现在的宽屏显示器宽高比和这个不一样了。

*** 覆盖图的几何变换

另一个关于覆盖图的精彩特性是它可以整体被旋转,扭曲,缩放。这可用于缩放菜单,把它们从屏幕外面丢进来这类美妙的特效。更多内容可以参考Overlay::scroll,Overlay::rotate和Overlay::scale。

*** 编写覆盖图脚本

覆盖图理所当然的可以在脚本里面体现,详情请参阅3.4 覆盖图脚本。

*** GUI系统

覆盖图只是被设计为非交互式的屏幕部件,当然,你也可以用它们做个简单的GUI(图形用户界面)。关于GUI解决方法的高深内容,我们建议采用CEGui(http://www.cegui.org.uk ),在示例Demo_Gui中有相关演示。
从源代码开始构建Ogre图文教程(Ogre 1.8 Source + VS2010) //--------------------------------------------------------------------------------------------------------------------------------------------------- //前言:捣鼓了一整天Ogre源代码下引擎环境的构建,从官网WIKI到百度, //再到谷歌,结合 阅读详情

相关推荐

OGRE中文帮助手册整理

OGRE中文帮助手册整理,从OGRE中文网站上考下来的文章,整理编排下做成PDF以供学习参考

OGRE手册 v1.4.4('Eihort') 中文版 第二章

#title OGRE手册 v1.4.4(Eihort) 中文版 第二章翻译:jackie214* 2. 核心对象** 介绍本教程带你快速了解将会在OGRE中用到的核心对象(core objects)以及它们的用途。** 谈谈命名空间(namespace)OGRE使用c++中命名空间(namespace)的特性。它可以把类(class),枚举(enum),结构(struceure)和其他东西都

jackie214的专栏 1747

ogre3D渲染游戏引擎五本经典中文教程

Pro OGRE 3D Programming中文翻译版本0.2.0.CHM OGRE中文帮助手册.chm OgreAPIReference.chm Ogre结构 OGRE的消息机制.pdf OGRE使用指南v0[1].01a.doc

ROS Indigo下MoveIt安装避坑指南:APT方案与环境依赖解析

MoveIt是ROS生态中官方认证的机器人运动规划中间件,其本质是一套耦合OMPL规划算法、FCL碰撞检测与RViz可视化能力的完整框架。理解其安装过程需从ROS依赖管理机制出发:APT包通过预编译二进制保障ABI兼容性,而源码编译易因gcc版本、Boost Python接口或libfcl.so动态链接失败导致运行时崩溃。在ROS 1 Indigo环境下,Ubuntu 14.04.6 LTS内核与libstdc++6版本构成关键约束条件,直接影响moveit_core等核心库的加载稳定性。典型应用场景包括P

weixin_34212762的博客 401

OGRE中文帮助手册

OGRE中文帮助手册: 将网上的chm转成pdf,希望有用, 无标签

OGRE学习全攻略(包括中文资料,教程,脚本手册等)

这是学习OGRE非常全面的资料,里面是我上手OGRE的过程中总结的几个非常有效的资料,包括如下资料:免费打工仔的文章,OGRE脚本手册,OGRE学习教程包括基础和中级教程,OGRE一起学教程,还有一个OGRE的pdf学习资料,望大家学有所用

TurtleBot3入门指南:ROS移动机器人实战从仿真到自主导航

移动机器人是机器人学的核心载体,其技术体系涵盖感知(激光雷达/深度相机)、定位与建图(SLAM)、路径规划(Navigation2)及运动控制等关键环节。TurtleBot3作为开源ROS移动机器人平台,凭借OpenCR实时控制器与树莓派协同架构,实现了软硬解耦、仿真(Gazebo)与实机行为高度一致的工程范式。它将抽象的TF坐标变换、话题通信、代价地图等ROS核心概念具象化为可观察、可调试的物理运动,显著降低学习门槛。广泛应用于高校教学、算法验证与创客开发,尤其适合需要快速构建‘传感器→算法→执行器’闭环

weixin_33831196的博客 431

Ogre与OSG的简单比较

Ogre与OSG的简单比较 Ogre与OSG的简单比较 Ogre与OSG的简单比较

Python 学习 ---> 模块、pypi ( 模块库 )、添加模块路径

什么是 模块 在 Python 中,一个.py文件就是一个模块(Module)。模块的名字就是文件的名字。在模块内部,通过全局变量__name__可以获取模块名(即字符串) 模块作用 为了实现代码的复用,通常会把一些其他程序中重用的代码拿出来单独放在一个程序文件中,

freeking101的博客 3485

ogre中文教程 ogre中文教程

ogre中文教程

测绘无人船避坑指南:云卓H12Pro遥控器接海康摄像头,从网络设置到RTSP流延迟优化全流程

本文详细解析了测绘无人船视频子系统的优化方案,重点介绍海康威视摄像头与云卓H12Pro遥控器的深度适配流程。从网络设置到RTSP流延迟优化,提供了一套经过实测的低延迟(<200ms)解决方案,适用于复杂水域环境下的测绘任务。

weixin_30415113的博客 627

[翻译] ogre 2.0 移植手册 - 1. 法律

[翻译]ogre 2.0 移植手册 - 1. 法律

weixin_43859510的博客 231

2.4G射频微带线阻抗匹配设计实战(WiFi/BLE)

本文深入探讨了2.4G射频微带线阻抗匹配在WiFi/BLE产品开发中的关键作用。文章详细解析了共面波导微带线结构,提供了基于SI9000工具的阻抗计算实战指南,并总结了不同PCB板厚下的设计参数对照表。同时,文章分享了PCB布局布线、与板厂沟通以及天线匹配调试等核心避坑经验,旨在帮助硬件工程师构建从射频芯片到天线的稳定高效传输通道。

j0k1l2m3n的博客 369

从零开始做3D地图编辑器(六)(基于QT与OGRE)

五、OGRE基础知识友善提醒:如果你对OGRE比较了解,请自觉跳过此节。本节并不打算提供详细的入门教程,只是对OGRE的简单介绍,如果需要OGRE的详细资料,请自行使用网络功能。1、OGRE是什么         Ogre是一款开源的图形渲染引擎,它的全名叫(Object-oriented Graphics Rendering Engine),目前在开源图形渲染引擎这一块排名第一,

步行者,一步一个脚印 3055

[记录一个bug]av_hwdevice_ctx_create出现Cannot allocate memory(附带库运行时路径)[已解决]

新写的程序里调用ffmpeg的av_hwdevice_ctx_create()这个函数,出现Cannot allocate memory。但是另个程序一样的代码,居然是成功的。 反复检查之后无果,就跳出去查了一下,看到一个问答: Have you tried to use ffmpg executables with the same libs that you using when you run the app? Have you tried to use ffmpg executables

熊猫Ben的博客 3586

EU 2021/646 eCall工程拆解:MSD、测试模式与型式核准

紧急呼叫系统(eCall)是车载通信中面向事故救援的安全功能,其原理是在碰撞或人工触发后,通过蜂窝网络向公共安全应答点发送最小数据集(MSD),并建立语音链路。技术价值在于缩短救援响应时间、提升事故后生存率,应用场景覆盖乘用车、轻型商用车及车载T-Box等前装通信模块。面向欧盟市场时,EU 2021/646把eCall从安装要求推进到型式核准测试,关注触发链路、备用电源、GNSS定位、MSD字段、音频质量与回拨能力。工程落地需要围绕测试模式、字段校验、配置管理和送检样件建立可交付合规方案。

weixin_31815843的博客 210

OGRE初级教程总结

一下内容是对OGRE基础教程的总结,大家可以先阅读中级教程1---9的内容,然后再回过头来浏览这片文章,否则可能会有很多看不懂的地方。      OGRE基础教程1主要讲了几个OGRE中的基本概念:1.  SceneManager:所有屏幕上可见的东西都由SceneManager来管理;有多种类型的SceneManager,分别用来渲染Terrain、BSP等等。2.  Ent

痞子龙3D编程 2788

STM32 LwIP协议栈优化:从TCP延迟10ms降至1ms的内存配置手册

摘要: 本文针对STM32嵌入式开发中LwIP TCP通信的高延迟问题(默认配置下延迟达10~20ms),提出纯软件优化方案,通过调整内存配置与TCP参数将延迟降至1ms。核心问题包括内存池不足、pbuf分配低效及Nagle算法拖累,优化步骤包括: 内存池扩容:增大MEMP_NUM_TCP_PCB至10、PBUF_POOL_SIZE至32,避免资源竞争; pbuf静态池分配:采用2048字节大块缓冲区匹配DMA传输,减少分块与拷贝; 关闭Nagle算法:设置TCP_NODELAY=1,禁用延迟确认以加速小包

weixin_42212753的博客 1711

OGRE中的屏幕坐标系

有屏幕绝对坐标系:度量单位为像素,如左上角为(0,0),右下角为(800,600)。屏幕相对坐标系:左下角为(-1,-1),右上角为(1,1),Rectangle2D::setCorners()用的就是就这个坐标系。屏幕单位化绝对坐标系。。。:左上角为(0,0),右下角为(1,1),Camera::getCameraToViewportRay()就是用的这个坐标系。 转自放...

anfu8346的博客 288

Java SSH框架学习

Java SSH框架学习

私信可回答各种问题~ 1792

人工智能面试总结-分类与聚类

目录说说常用的分类算法,以及各自的优缺点?说说为什么正确率有时不能有效评估分类算法?说说什么样的分类器最好?说说聚类算法有哪些衡量标准?(选看)各聚类算法性能比较汇总说说什么是聚类,你知道哪些聚类算法?具体展开介绍你知道的聚类算法?说说K-Means聚类算法流程?说说K-Means聚类算法如何调优?说说K-Means聚类算法如何选择初始点?说说K-Means聚类聚的是特征还是样本?说说K-Means聚类的特征距离是如何计算的?说说聚类与分类的区别?手撕K-Means聚类 说说常用的分类算法,以及各自的优缺点

啥都生的博客 3865

[OGRE]基础教程来一发:来谈一谈基础框架

本次教程的主要目的是介绍一下OGRE最基础的构架: 1.场景管理器 2.场景节点 3.实体 虽然本次教程不会接触到太多的代码,而是把侧重点放在了基础知识的讲解上,但是希望大家一点一点积累对代码的理解,这样才能更彻底的理解一些抽象的概念。 我们先新建一个OGRE项目,OgreApp01。 添加一个h文件TutorialApplication.h,在里面添加如下内容: #incl

汪海的实验室 4127

【腾讯小龙虾WorkBuddy专栏04】一文搞懂WorkBuddy的「专家」和「专家团」

WorkBuddy专家与专家团:专业级AI协作解决方案 WorkBuddy的专家(Expert)与专家团(Expert Team)功能颠覆了通用AI的局限性,提供角色化、可交付的专业服务。 核心优势 专家:深度垂直领域的AI顾问,具备人设、方法论、工具链,如全栈开发专家能直接交付完整项目,而非代码片段。 专家团:多智能体协作,自动拆解复杂任务(如竞品分析、全栈开发)并分发给对应角色,并行执行后整合输出,效率提升显著。 使用场景 单专家:解决专业问题(如SQL优化、UI设计)。

AI人人懂 2033

Ogre入门尝鲜

Ogre入门尝鲜

sinat_31425585的博客 1485

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

OGRE简析(一)

------OGRESampleBrowser框架解析 “伟大航路,我把世界上的一切都放在了那里,有种的话就去领取吧” 这是OGRE中文网的一则广告,我想,无论作为OGRE的学习者还是漫漫人生的一名旅人,这句话都是非常不错的激励语。放在这,是否能够让你隐约看到属于自己的新世界? 简介 Ogre(Object-orientedGraphics Rendering Engine)是一款优秀的C

相信爱的力量,坚持自己的梦想。 1451

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Ogre编程入门与进阶】第二章 Ogre相关知识回顾

转载请说明出处! http://blog.youkuaiyun.com/zhanghua1816/article/details/8067669 第一章,我们简单介绍了什么是Ogre,它能用来做什么。OGRE(Object-Oriented Graphics RenderingEngine是一个面向对象图形渲染引擎,它用C++开发而成,而且,它隐藏了底层系统库(如:Direct3D和OpenGL)

Everything is possible 1万+
上一篇: OGRE的坐标体系和角度转向
XRZEngine
博客等级 码龄18年 0粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值