Ogre学习记录(二)-RaySceneQuery

Vulkan_Ray Tracing 01_API基础 本专栏我们主要来学一下Vulkan的光线追踪API的具体实现,本章主要是对其光追API拓展的简介,具体参照官网的两篇文章:Ray Tracing In Vulkan与 Vulkan-Guide。 一、 二、Vulkan Ray Tracing API Vulkan API 中对光追提供了一下拓展支持。 VK_KHR_acceleration_structure VK_KHR_ray_tracing_pipeline VK_KHR_ray_query VK_KHR_pipeline_libra 阅读详情

这篇主要记录关于Ogre Wiki上的IntermediateTutorial教程2,3的一些改动:

        这两篇的内容涉及到了 TerrainSystem和CEGUI,而由于Ogre和CEGUI的快速更新,这两篇教程已经不能在Ogre1.8和cegui0.8正确的运行了,但是这两个教程在开始的时候也都声明了1.8的变化,但是没有给出实现的代码,自己在实现这两个例子的时候也花费了不少时间,现在直接把最新的实现记录一下,仅供参考。

先贴出来:

Tutorial2:

Changes needed for Ogre 1.8 and above:
- The Terrain Scene Manager is obsolete and has been replaced by the terrain component system. Please go through Basic Tutorial 3 to learn how to use it. 
- For now, use the terrain generated in Basic Tutorial 3 for this tutorial. There will be glitches (such as the camera being able to go through parts of the terrain if you follow this tutorial's code). 
- This tutorial will ask you to use RaySceneQueries to find objects of type worldFragment. General-purpose queries are no longer used for this. Instead, call the rayIntersects() function in your TerrainGroup object. It takes an Ogre::Ray as an argument (and a distance limit as an optional second argument, of type Real) and returns an Ogre::TerrainGroup::RayResult object (ex. Ogre::TerrainGroup::RayResult result = terrain_group->rayIntersects(mouse_ray)). RayResult has three public members: bool hit, true if the given ray hit the TerrainGroup object, Ogre::Vector3 position, the x, y and z coordinates of the point of intersection and Ogre::Terrain terrain, the terrain object that was hit.

Tutorial3:

Changes needed for Ogre 1.8 and above:
- Don't test for worldFragments when you are checking if we clicked on the terrain or a movable. Instead: 
- Make your ray query as normal 
- Add a boolean that tracks if we found a movable object or not (set it to true by default). Place the code that adds an entity to the scene inside an if statement that checks if this bool is true 
- In the for loop where you iterate through your query results, in the if statement, check if iter is a movable, its name is not the name of your camera entity and its name is not "" 
- If true, set the current entity to the entity you found as normal, but set the boolean to false (so it doesn't run the code that adds a new entity to the scene), then break

        这两篇教程主要是告诉大家如何利用Ogre的Ray和RaySceneQuery来实现场景内的一些基本的碰撞检测.

        Ray可以理解为从场景中一个点来发射一条射线,然后RaySceneQuery可以返回场景中所有与这条射线有交点的物体,及其交点的具体坐标,Ray的source可以是很多东西,可以是你的Camera,可以是你的Mouse,可以是你的Scene中的任何一个Entity等等;返回的交点坐标集被存储在一个RaySceneQueryResult的vector中,供用户使用。


        例如教程2就利用Camera发出的Ray来检测Camera与Terrain之间的距离,防止我们的Camera发生穿越地形的现象,然后利用mouse发出的Ray在mouse与Terrain的交点处创建物体,这就是告诉大家如何实现星际和War3中在指定的位置建建筑的方法。

        然后教程3告诉大家如何利用RaySceneQueryResult来检测movable object,也就是在地形之上的东西,这里用到了RaySceneQuery的排序功能,将交点按照远近距离排序,这就可以实现用鼠标获取地形上的某个entity,例如你要选择某一个英雄,或者你要攻击某一个敌人,都需要用鼠标点击这个你要操作的对象,最后教程3介绍了RaySceneQuery的一些Mask,设置这些Mask可以用来忽略一些特殊的交点:例如,你希望让你的Ray忽略与地面的交点,只关注movable object,例如你想忽略粒子系统和一些GUI的框框等等。

        Ogre1.8下由于引入了TerrainSceneManager,之前用于建立地形的代码(如下)已经不能使用了。

 // World geometry
mSceneMgr->setWorldGeometry("terrain.cfg");
        用于建立地形的新玩意儿叫做TerrainManager,具体的用法在BasicTuroial3中有很详细的代码,我这里不全列出来,只是将其中关于地形的方面列出来(所有代码都是基于wiki的BaseApplication框架的)

        首先,类的声明中你需要使用到的类成员变量与成员方法。

/*added for Terrain System*/
Ogre::TerrainGlobalOptions* mTerrainGlobals;
Ogre::TerrainGroup* mTerrainGroup;
bool mTerrainsImported;

void defineTerrain(long x, long y);
void initBlendMaps(Ogre::Terrain* terrain);
void configureTerrainDefaults(Ogre::Light* light);
        类的实现中具体创建的方法:

void IntermediateTutorial3::createScene(void)
{
<span style="white-space:pre">	</span>/*其它你需要建立的东西*/

	/*开始建立地形*/
	Ogre::MaterialManager::getSingleton().setDefaultTextureFiltering(Ogre::TFO_ANISOTROPIC);
	Ogre::MaterialManager::getSingleton().setDefaultAnisotropy(7);

	Ogre::Vector3 lightdir(0.55, -0.3, 0.75);
	lightdir.normalise();

	Ogre::Light* light = mSceneMgr->createLight("tstLight");
	light->setType(Ogre::Light::LT_DIRECTIONAL);
	light->setDirection(lightdir);
	light->setDiffuseColour(Ogre::ColourValue::White);
	light->setSpecularColour(Ogre::ColourValue(0.4, 0.4, 0.4));

	mTerrainGlobals = OGRE_NEW Ogre::TerrainGlobalOptions();
	mTerrainGroup = OGRE_NEW Ogre::TerrainGroup(mSceneMgr, Ogre::Terrain::ALIGN_X_Z, 513, 12000.0f);
	mTerrainGroup->setFilenameConvention(Ogre::String("IntermediateTutorail"), Ogre::String("dat"));
	mTerrainGroup->setOrigin(Ogre::Vector3::ZERO);

	configureTerrainDefaults(light);

	for (long x = 0; x <= 0; ++x)
		for (long y = 0; y <= 0; ++y)
			defineTerrain(x, y);

	mTerrainGroup->loadAllTerrains(true);

	if(mTerrainsImported)
	{
		Ogre::TerrainGroup::TerrainIterator ti = mTerrainGroup->getTerrainIterator();
		while(ti.hasMoreElements())
		{
			Ogre::Terrain* t = ti.getNext()->instance;
			initBlendMaps(t);
		}
	}

	mTerrainGroup->freeTemporaryResources();
	/*地形建立完毕*/

<span style="white-space:pre">	</span>/*其它你需要建立的东西*/
}

configureTerrainDefaults:

void IntermediateTutorial3::configureTerrainDefaults(Ogre::Light* light)
{
	mTerrainGlobals->setMaxPixelError(8);

	mTerrainGlobals->setCompositeMapDistance(3000);

	mTerrainGlobals->setLightMapDirection(light->getDerivedDirection());
	mTerrainGlobals->setCompositeMapAmbient(mSceneMgr->getAmbientLight());
	mTerrainGlobals->setCompositeMapDiffuse(light->getDiffuseColour());

	Ogre::Terrain::ImportData& defaultimp = mTerrainGroup->getDefaultImportSettings();
	defaultimp.terrainSize = 513;
	defaultimp.worldSize = 12000.0f;
	defaultimp.inputScale = 600; // due terrain.png is 8 bpp
	defaultimp.minBatchSize = 33;
	defaultimp.maxBatchSize = 65;

	defaultimp.layerList.resize(3);
	defaultimp.layerList[0].worldSize = 100;
	defaultimp.layerList[0].textureNames.push_back("dirt_grayrocky_diffusespecular.dds");
	defaultimp.layerList[0].textureNames.push_back("dirt_grayrocky_normalheight.dds");
	defaultimp.layerList[1].worldSize = 30;
	defaultimp.layerList[1].textureNames.push_back("grass_green-01_diffusespecular.dds");
	defaultimp.layerList[1].textureNames.push_back("grass_green-01_normalheight.dds");
	defaultimp.layerList[2].worldSize = 200;
	defaultimp.layerList[2].textureNames.push_back("growth_weirdfungus-03_diffusespecular.dds");
	defaultimp.layerList[2].textureNames.push_back("growth_weirdfungus-03_normalheight.dds");

}

defineTerrain:

void IntermediateTutorial3::defineTerrain(long x, long y)
{
	Ogre::String filename = mTerrainGroup->generateFilename(x, y);
	if (Ogre::ResourceGroupManager::getSingleton().resourceExists(mTerrainGroup->getResourceGroup(), filename))
	{
		mTerrainGroup->defineTerrain(x, y);
	}
	else
	{
		Ogre::Image img;
		getTerrainImage( x%2 != 0, y%2 != 0, img);
		mTerrainGroup->defineTerrain(x, y, &img);
		mTerrainsImported = true;
	}
}
void getTerrainImage(bool flipX, bool flipY, Ogre::Image& img)
{
    img.load("terrain.png", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
    if (flipX)
        img.flipAroundY();
    if (flipY)
        img.flipAroundX();


}
initBlendMaps:

void IntermediateTutorial3::initBlendMaps(Ogre::Terrain* terrain)
{
	Ogre::TerrainLayerBlendMap* blendMap0 = terrain->getLayerBlendMap(1);
	Ogre::TerrainLayerBlendMap* blendMap1 = terrain->getLayerBlendMap(2);
	Ogre::Real minHeight0 = 70;
	Ogre::Real fadeDist0 = 40;
	Ogre::Real minHeight1 = 70;
	Ogre::Real fadeDist1 = 15;
	float* pBlend0 = blendMap0->getBlendPointer();
	float* pBlend1 = blendMap1->getBlendPointer();
	for (Ogre::uint16 y = 0; y < terrain->getLayerBlendMapSize(); ++y)
	{
		for (Ogre::uint16 x = 0; x < terrain->getLayerBlendMapSize(); ++x)
		{
			Ogre::Real tx, ty;

			blendMap0->convertImageToTerrainSpace(x, y, &tx, &ty);
			Ogre::Real height = terrain->getHeightAtTerrainPosition(tx, ty);
			Ogre::Real val = (height - minHeight0) / fadeDist0;
			val = Ogre::Math::Clamp(val, (Ogre::Real)0, (Ogre::Real)1);
			*pBlend0++ = val;

			val = (height - minHeight1) / fadeDist1;
			val = Ogre::Math::Clamp(val, (Ogre::Real)0, (Ogre::Real)1);
			*pBlend1++ = val;
		}
	}
	blendMap0->dirty();
	blendMap1->dirty();
	blendMap0->update();
	blendMap1->update();
}
        是不是感觉很繁杂。。。。我也这么觉得,突然觉得1.7的一行代码搞定真是太简单的,但是据说TerrainManager可以大大增加Ogre的地形处理的能力,具体的我也还没有深入了解,但是搞清楚上面例子你也可以学到很多东西,理解地形建立过程中到底做了那些事情,可以有哪些全局的配置,比如地形是由heighMap和贴图组成的,比如你可以将img文件生成的地图信息保存起来,下次进入时就可以直接读取而不需要再从img重建地形了。

        CEGUI的部分我就不详细说了,BasicTutorial7有详细的应用,下面要开始介绍这两个例子在Ogre1.8中TerrainManager下RaySceneQuery的一些变化:

  • RaySceneQuery不能再用于检测与Terrain之间的交点。
  • Ogre::Ray与Terrain的交点直接由TerrianGroup::RayResult来管理。
  • RaySceneQuery仍可以用于检测Movable Object。
Ogre1.8中求Ray与Terrain交点的方法:
CEGUI::Vector2f  mousePos = CEGUI::System::getSingleton().getDefaultGUIContext().getMouseCursor().getPosition();
Ogre::Ray mouseRay = mCamera->getCameraToViewportRay(mousePos.d_x/float(arg.state.width), mousePos.d_y/float(arg.state.height));
mRaySceneQuery->setRay(mouseRay);
Ogre::TerrainGroup::RayResult result = mTerrainGroup->rayIntersects(mouseRay);
// Get results, create a node/entity on the position
if (result.hit)/*如果有交点,result.hit为true,并且result.position中含有交点具体坐标,根据此坐标创建一个robot*/
{
	Ogre::Entity *ent;
	char name[16];
	sprintf( name, "Robot%d", mCount++ );
	ent = mSceneMgr->createEntity(name, "robot.mesh");
<span style="white-space:pre">	</span>
	mCurrentObject = mSceneMgr->getRootSceneNode()->createChildSceneNode(std::string(name)+ "Node", result.position);
	mCurrentObject->attachObject(ent);
	mCurrentObject->setScale(1.0f, 1.0f, 1.0f);
} // if
Ogre1.8中求与movable object交点的方法,不变,但是由于与Terrain交点的方法改变,因此教程3中的mousePressed代码应该更改如下:
bool IntermediateTutorial3::mousePressed(const OIS::MouseEvent& arg, OIS::MouseButtonID id)
{
	//show that the current object has been deselected by removing the bounding box visual
	if(mCurrentObject)
	{
		mCurrentObject->showBoundingBox(false);
	}

	if(id == OIS::MB_Left)
	{
		// Setup the ray scene query, use CEGUI's mouse position
		CEGUI::Vector2f  mousePos = CEGUI::System::getSingleton().getDefaultGUIContext().getMouseCursor().getPosition();
		Ogre::Ray mouseRay = mCamera->getCameraToViewportRay(mousePos.d_x/float(arg.state.width), mousePos.d_y/float(arg.state.height));
		mRaySceneQuery->setRay(mouseRay);
		mRaySceneQuery->setSortByDistance(true);

		Ogre::RaySceneQueryResult &queryResult = mRaySceneQuery->execute();
		Ogre::RaySceneQueryResult::iterator itr = queryResult.begin();

		bSelectedMovable = false;
		for (; itr != queryResult.end(); itr++)
		{
			if(itr->movable && itr->movable->getName() != ""
							&& itr->movable->getName() != mCamera->getName())
			{
				bSelectedMovable = true;
				std::cout << "find movable object!" <<   itr->movable->getName() << std::endl;
				mCurrentObject = itr->movable->getParentSceneNode();
				break;
			}
		}

		if(bSelectedMovable == false)
		{
			Ogre::TerrainGroup::RayResult result = mTerrainGroup->rayIntersects(mouseRay);
			// Get results, create a node/entity on the position
			if (result.hit)
			{
				Ogre::Entity *ent;
				char name[16];

				if (bRobotMode)
				{
					sprintf( name, "Robot%d", mCount++ );
					ent = mSceneMgr->createEntity(name, "robot.mesh");
				}
				else
				{
					sprintf(name, "Ninja%d", mCount++);
					ent = mSceneMgr->createEntity(name, "ninja.mesh");
				} // else

				mCurrentObject = mSceneMgr->getRootSceneNode()->
						createChildSceneNode(std::string(name)+ "Node", result.position);
				mCurrentObject->attachObject(ent);
				mCurrentObject->setScale(1.0f, 1.0f, 1.0f);
			} // if
		}
		mLMouseDown = true;
	}
	else if(id == OIS::MB_Right)
	{
		CEGUI::System::getSingleton().getDefaultGUIContext().getMouseCursor().hide();
		mRMouseDown = true;
	}

	//now we show the bounding box so the user can see that this object is selected
	if(mCurrentObject)
	{
	        mCurrentObject->showBoundingBox(true);
	}
	return true;
}
        提供一个bSelectedMovable变量来表示鼠标是否与某个已经存在的对象有交点,如果是,获取此对象,如果不是,再测试鼠标与地形的交点,并在交点处创建一个robot或者ninja。
        以下是测试结果:




Unity-Scene-Query:用于遍历和查询Unity场景以查找特定对象的库,使用类似于CSS选择器的工具来识别游戏对象 Unity场景查询 一个用于遍历和查询场景以查找特定游戏对象的库。 查询语言用于识别游戏对象,其外观类似于。 有关深入的报道,请阅读有关的文章。 例子 此回购包含一些示例。 场景遍历的更多示例: : 。 场景查询的更多示例: : 。 在Unity中设置 在您的Unity项目中包含DLL或源代码。 在代码中包含名称空间: using RSG.Scene.Query; 根据您要使用的内容实例化SceneTraversal和/或SceneQuery : var sceneTraversal = new SceneTraversal(); var sceneQuery = ne 立即下载

相关推荐

HyperLynx实战:手把手教你搞定DDR4信号完整性仿真(附ODT与终端电阻配置避坑)

本文详细介绍了使用HyperLynx进行DDR4信号完整性仿真的实战技巧,重点解析了ODT配置与终端电阻优化的黄金法则。通过模型准备、拓扑构建、ODT扫描等关键步骤,帮助硬件工程师规避常见设计陷阱,提升高速数字电路设计的效率与可靠性。

weixin_30861797的博客 639

The-Forge光线追踪实现:跨平台Ray Query技术的完整指南

The-Forge是一个强大的跨平台渲染框架,支持PC Windows、Linux、macOS/iOS、Android、XBOX、PS4、PS5、Switch和Quest 2等多个平台。其光线追踪实现基于Ray Query技术,为开发者提供了统一的解决方案。🚀 ## 什么是Ray Query技术? Ray Query是Vulkan 1.2引入的一项光线追踪技术,允许在计算着色器或片段着色器中

gitblog_00993的博客 713

【Allegro学习笔记】常规标贴封装创建-0402封装创建实例

摘要 本文主要介绍如何使用Allegro制作表面贴装封装。 所使用的软件 使用Allegro制作常规贴片封装主要使用的软件有Pad Designer和Allegro 1 0402类封装制作 1.1 0402类封装焊盘分析 0402封装尺寸图如图1...

Honglong 1万+

场景的查询框架 :SceneQuery

构建一个场景一般都是比较复杂的,像这样一个复杂的场景我们是不会直接拿去渲染的,这就涉及到我们为了达到各种目的对现有的场景各种目的进行切割,最终我们会使用我们切割的这部分内容。     SceneQuery: 这个类里面需要关注的是它定义的一个WorldFragment的结构体,这个结果体描述的是世界整体的一个部分。 enum WorldFragmentType { // Wo...

l1987021的专栏 521

保姆级教程:用R包ggpicrust2搞定PICRUSt2功能预测,从差异分析到热图PCA一键出图

本文提供了一份详细的ggpicrust2使用指南,帮助用户从零开始完成PICRUSt2功能预测数据的差异分析和可视化。通过安装配置、数据导入、差异分析到高级可视化(如热图和PCA)的全流程讲解,即使是初学者也能快速掌握发表级图表的生成技巧。

weixin_33712987的博客 384

避坑指南:Abaqus网格划分中90%用户会遇到的5个质量陷阱(附解决方案)

本文深入剖析Abaqus网格划分中90%用户会遇到的5个典型质量陷阱,包括单元扭曲、扫掠网格失败、尺寸梯度控制等,并提供工程级解决方案。通过Python脚本和虚拟拓扑等技巧,帮助用户提升网格质量,确保有限元分析结果的可靠性,适用于CAE工程师和仿真分析师。

weixin_29243279的博客 98

Ogre射线场景查询

<br />昨晚在看中级教程二的时候,发现VS2005竟然总是无法在我输入.后显示成员列表,并且我自己补全后,还提示我并没有该成员函数。我左看看代码,右看看代码,觉得总是没错。幸好Ogre还是开源的,我顺着类一个个往上翻,更加无比的确认了自己的是对的,冒着“万般”的危险按下了F5,结果程序通过了……<br />事后一想,这个是用到了C++里的反射机制。这个我不是太了解,曾经在老师带的一个项目里接触过,但那是老师负责,自己也放过了自己,所以到现在也还是不懂。大意应该就是直到运行的时候才确定那个容器里的对象是什

stilling2006的专栏 1117

告别环境报错:Qt Creator里配置Android SDK/NDK/JDK路径的完整避坑指南

本文详细解析了在Qt Creator中配置Android SDK/NDK/JDK路径的完整避坑指南,深入探讨了路径检测的内部机制、构建套件配置的隐藏逻辑以及项目级与全局配置的优先级。通过实际案例和高级排查技巧,帮助开发者解决常见的环境报错问题,提升Qt安卓开发效率。

weixin_42548829的博客 238

OGRE中级教程二 RaySceneQueries and Basic Mouse Usage

英语水平有限,欢迎大家批评指正 本文并没有将原文全部翻译,只是将其中的一些知识点翻译总结了一下,想要查看详细讲解的话,可以到原文处看一下,附上英文原文地址:http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Intermediate+Tutorial+2&structure=Tutorials Setting up the Scene

愤怒的小小强 1188

ABAP CDS HAVING 全解析:聚合之后的精准过滤、最佳实践与可运行示例

摘要: 本文针对具备ABAP与CDS基础的开发者,详解HAVING在ABAP CDS中的核心用法。HAVING专用于过滤GROUP BY后的聚合结果(如SUM、COUNT),与WHERE的分工明确:前者处理聚合值,后者过滤原始记录。通过销售额阈值、质量分析、财务对账三类典型场景,结合性能优化建议(如优先使用WHERE索引过滤),说明实际应用。文中提供经典CDS View与View Entity两种实现代码,并附Open SQL消费示例,帮助开发者快速落地。常见误区(如聚合条件误写至WHERE)与规避方法亦被

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 220

番外篇 | 关于YOLO11算法的改进点总结

关于YOLO11算法的改进点总结。🌈

小哥谈 2311

Ogre中的碰撞检测(6)

在3中,我提到检测到碰撞时候,后移一个单位,摄像机会抖动,现在通过记录摄像机上步移动偏移量,如果检测到碰撞则反移回来,可以解决这个问题。下面是修改后的代码: <img id="Code_Closed_Image_093847" style="display: none;" onclick="function onclick(){this.style.display=none

599

Windows环境下QGIS完整编译指南(从环境搭建到问题解决)

本文详细介绍了在Windows 11系统下编译QGIS 3.40.12版本的完整流程。主要内容包括:前期准备工作(系统要求、工具清单)、环境搭建(Visual Studio 2026、OSGeo4W、Qt Creator的安装配置)、以及详细的CMake参数设置。特别强调了依赖管理的重要性,并提供了解决常见编译错误的方案。该指南适用于GIS二次开发、QGIS功能定制和源码学习等场景,通过OSGeo4W工具简化了复杂的依赖管理过程,确保编译过程的可重复性。

LuckyHanMo的博客 1333

Vulkan Samples 阅读 -- Hardware Accelerated Ray Tracing(二)Reflections & Callable & Query

目录Ray Traced Reflectionspreparerendershader小结 Ray Traced Reflections prepare createBottomLevelAccelerationStructure: 在本地创建模型底层加速结构信息 loadFromFile:加载模型 创建两个VkDeviceOrHostAddressConstKHR,分别存放vbo和ibo的指针(deviceAddress) vertexBufferDeviceAddress : getBufferD

jiamada的博客 1043

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Ogre——射线查询返回结果的说明

该结构有一个单向比较,即只有;     struct _OgreExport RaySceneQueryResultEntry     {         /// 距离射线起点的距离;         Real distance;         /// 指向MovableObject对象。         MovableObject* movable;

无敌的专栏 1030

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ogre射线场景查询

1.创建射线场景查询对象,记得最后销毁mRaySceneQuery = mSceneMgr->createRayQuery(Ray());销毁的代码是  mSceneMgr->destroyQuery(mRaySceneQuery);2.设置要查询的射线,下面代码是以摄像机竖直向下的射线对场景进行查询Vector3 camPos = mCamera->getPosition();Ray camer

XIAOZHI0999的专栏 3748

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

场景查询

场景管理的一个重要的功能就是场景查询,而ogre支持的场景查询方法包括: 1、光线查询(Ray Queries); 2、球体查询(Sphere Queries); 3、边界盒查询(Bounding-Box Queries); 4、边界平面查询(Bounding-Plane Queries); 5、相交查询(Intersection Queries)。     光线查询: RaySc

狼牙 1141

OGRE地形生成

OGRE可以通过两个接口来生成地形,分别是void TerrainSceneManager::setWorldGeometry( const String& filename )以及void TerrainSceneManager::setWorldGeometry(DataStreamPtr& stream, const String& typeName ),两者的根本区别就是一个是传递地形信息

痞子龙3D编程 1697

ogre场景查询—简单学习

一.简要概述:         在ogre中场景查询主要使用SceneQuery及其子类。场景查询主要有三中:RaySceneQuery即射线场景查询;RegionSceneQuery即区域场景查询;IntersectionSceneQuery即相交场景查询;而RegiontionSceneQuery又分为:SphereSceneQuery, AxisAlignedBoxSceneQuery和

fyk58的专栏 1023

OGRE最简单的射线拾取详解

<br />射线拾取原理是从摄像机发射一条经过鼠标位置的射线,计算射线和哪些三角形相交,然后计算这些三角形所属的场景对象(可以是Entity,Light,平面等等)<br />OGRE已经帮我们实现了基本的功能。<br />在这里实现的是最简单的鼠标射线拾取。<br />view plaincopy to clipboardprint?<br />bool GuiFrameListener::mousePressed( const OIS::MouseEvent &arg, OIS::MouseButton

痞子龙3D编程 2993

OGRE中级教程三 Mouse Picking(3D Object Selection) and SceneQuery Masks

英语水平有限,欢迎大家批评指正 本文并没有将原文全部翻译,只是将其中的一些知识点翻译总结了一下,想要查看详细讲解的话,可以到原文处看一下,附上英文原文地址:http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Intermediate+Tutorial+3&structure=Tutorials Showing Which Object is S

愤怒的小小强 1675

Ogre中场景查询和碰撞检测

Ogre中场景查询相关类 基类SceneQuery、其子类RegionSceneQuery区域查询、RaySceneQuery射线查询、IntersectionSceneQuery相交查询 每种场景查询都有对应的SceneQueryResult和SceneQueryListener 查询结果分为场景中可移动的物体元素(MovableObject)和世界信息(复杂场景中的地形等不变的元素)

Anne的IT小天地 741

【笔记】十、射线场景查询、基础鼠标

 A、目标:  初步创建一个基础场景编辑器。在过程之中,涉及到:  1、如何使用RaySceneQueries阻止镜头穿透地面  2、如何使用MouseListener和MouseMotionListener接口  3、使用鼠标选取地面上的x和y坐标B、功能:   首先,要将鼠标右键绑定到“鼠标观察”模式。    第二,要让镜

Welcome Friends~ 1072

Ogre射线精确查询

bool PickEntity(Ogre::RaySceneQuery* mRaySceneQuery, Ogre::Ray &ray, Ogre::Entity **result, Ogre::uint32 mask ,Ogre::Vector3 &hitpoint, bool

苗伟业的专栏 2625

OGRE场景查询

场景查询创建查询的代价比较大,而执行不是。SceneQueryResualt只定义了两种成员:movables与worldFragments.掩码也需要自己定义,自己解释。在一个轴对齐盒子中查询灯光的例子如下:const unsigned int LIGHT_QUERY_MASK = 0x00000001; //掩码定义Light* light1 = mSceneMgr->createLight("Light1");Light* light2 = mSceneMgr->createLight("Light2

痞子龙3D编程 1893
上一篇: Fedora下的Ogre编译与安装
下一篇: ACE和ICE
tinyFatAries
博客等级 码龄12年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值