Ogre个人初步学习总结

目录

1.开发环境

2.环境配置

2.1Ogre环境配置

2.2ParticleUniverse 环境配置

3.OGRE的学习札记

3.1Ogre的学前准备

3.1.1Ogre1.8.1的Sample事例分析

3.1.2熟悉Ogre的第一个的项目

3.1.3编写Ogre的样例的注意事项

3.2Ogre的基本知识

3.2.1Ogre场景内的坐标

3.2.2利用Ogre生成Entity实体

3.2.3Ogre中的节点SceneNode

3.2.4利用Ogre生成灯光Light

3.2.5Ogre中的资源路径设置和读取

3.2.6Ogre中的材质Material

3.2.7Ogre中的粒子系统ParticleUniverse

3.2.8Ogre中的合成器compositor

3.2.9Ogre的多视口的实现

3.2.10学习Ogre例子的个人心得

Ogre个人初步学习总结

  1. 开发环境

(1)操作系统:win7;

(2)开发工具:Visual Studio 2015(平台工具集v100)、Ogre1.8.1

(3)开发语言:C++;

  1. 环境配置

2.1            Ogre环境配置

主要是在windows操作系统上对Ogre的环境配置:

(1)              在Ogre官网下载Ogre1.8.1;

(2)              配置环境变量,将Ogre的路径作为变量值,变量为OGRE_HOME,比如下图所示

(3)              然后在链接:https://pan.baidu.com/s/10IvsXpsJ2H5Ot-QTCwHIKw  提取码:1ahw 下载Ogre_VC10_App(此插件在生成项目时,只会在VS2010显示),可快速生成基本的自带Ogre环境的Visual Studio程序,如下图所示:

(4)              如果不想在VS2010中开发Ogre,可以在VS2010中上述(3)中的快速生成Ogre

项目的方法先生成一个项目,而后以visual studio的其他版本打开即可,切记如果不是从Visual Studio 2010打开的项目,需要将项目属性的平台工具集修改为v100(vs2010平台),如下图是用Visual Studio 2015打开的Ogre的项目

(5)              如果是首次使用Ogre程序,需要先学习Ogre1.8.1自己带有的sample例子;

2.2            ParticleUniverse 环境配置

Ogre御用粒子系统的配置:

(1)       首先要下载ParticleUniverse-Ogre19current.zip以及Particle Universe Editor

(2)       添加particleuniverse-ogre19-current\Plugins\ParticleUniverse\src与particleuniverse-ogre19-current\Plugins\ParticleUniverse\include到项目

中的附加包含目录中

(3)       添加链接库 将particleuniverse_d.lib添加到Ogre库目录中,将particleuniverse_d.dll添加到项目中的Debug目录下,在debug目录下的Plugin_d.cfg文件中添加Plugin=ParticleUniverse_d,在链接库中的附加依赖项添加ParticleUniverse_d.lib

  1. Ogre的学习札记

3.1            Ogre的学前准备

3.1.1  Ogre1.8.1的Sample事例分析

打开我们的Ogre1.8.1的安装目录,并利用VisualStuio(第一次学习的话,为避免一些错误,尽量使用Visual Studio 2010)打开OGRE.sln,

Ogre1.8.1的Sample事例中虽然有三十几个例子之多,但在生成可执行文件的时候,只生成一个.exe文件,也就是下图红框所标注的SampleBrowser.exe,其他的项目在生成的时候,只会生成库文件(.dll的形式的文件) 仅供 SampleBrowser.exe所调用,这对于初学Ogre的学者是相当的不友好,比如说Sample_Grass在整个解决方案生成的时候,只会生成Sample_Grass.dll文件,我们都知道.dll配置文件是打不开的,只有exe文件能打开;

下面我们就来生成一下我们的Ogre1.8.1的Sample例子的解决方案,如下图所示

我们可以从上图可以看到,解决方案中的所有列子都在里面,从这里我们可以看出所有的生成dll的例子的文件(比如说Sample_Grass.dll)都被exe程序所调用SampleBrowser.exe,当然我们也可以从代码中可以看到,我们现在就以Sample_Grass项目为例,打开Sample_Grass项目的cpp文件

可以看到以下的代码(实际上也只能看到这两个函数,因为所有的类中的函数,基本上都写成了内联函数)。

extern "C" _OgreSampleExport void dllStartPlugin()

{

s = new Sample_Grass;

sp = OGRE_NEW SamplePlugin(s->getInfo()["Title"] + " Sample");

sp->addSample(s);

Root::getSingleton().installPlugin(sp);

}

extern "C" _OgreSampleExport void dllStopPlugin()

{

Root::getSingleton().uninstallPlugin(sp);

OGRE_DELETE sp;

delete s;

}

从这两个函数的名字可以看出,一个是加载Sample_Grass例子的函数(void dllStartPlugin()),一个是停止加载Sample_Grass例子的函数(void dllStopPlugin()),这些加载和卸载函数都在SampleBrowser项目中调用,呈现出了很多例子在一个exe程序中的集合(就像是在QQ游戏大厅下有N多个游戏,可以进行选择玩哪一款,有兴趣可以学习下这种思想)。

3.1.2  熟悉Ogre的第一个的项目

我们利用Visual Studio2010创建出我们的Ogre的第一个项目,先来认识一下头文件

class BaseApplication : public Ogre::FrameListener, public Ogre::WindowEventListener,

public OIS::KeyListener, public OIS::MouseListener, OgreBites::SdkTrayListener

{

public:

BaseApplication(void);//构造函数

virtual ~BaseApplication(void);//析构函数

virtual void go(void);//运行函数

protected:

virtual bool setup();

virtual bool configure(void);//配置Ogre运行的函数

virtual void chooseSceneManager(void);//选择场景管理器的函数

virtual void createCamera(void);//创建摄像机的函数

virtual void createFrameListener(void);

virtual void createScene(void) = 0; // Override me!

virtual void destroyScene(void);//销毁场景的函数

virtual void createViewports(void);//创建视口的函数

virtual void setupResources(void);

virtual void createResourceListener(void);//创建资源监听

virtual void loadResources(void);

// Ogre::FrameListener

virtual bool frameRenderingQueued(const Ogre::FrameEvent& evt);//帧监听

// OIS::KeyListener

virtual bool keyPressed( const OIS::KeyEvent &arg );//键盘按下键的函数

virtual bool keyReleased( const OIS::KeyEvent &arg );//键盘的按键抬起的函数

// OIS::MouseListener

virtual bool mouseMoved( const OIS::MouseEvent &arg );//鼠标移动的函数

virtual bool mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id );//鼠标按键键的函数

virtual bool mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id );//鼠标释放按键的函数

// Ogre::WindowEventListener

//Adjust mouse clipping area

virtual void windowResized(Ogre::RenderWindow* rw);

//Unattach OIS before window shutdown (very important under Linux)

virtual void windowClosed(Ogre::RenderWindow* rw);

Ogre::Root *mRoot;

Ogre::Camera* mCamera;

Ogre::SceneManager* mSceneMgr;

Ogre::RenderWindow* mWindow;

Ogre::String mResourcesCfg;

Ogre::String mPluginsCfg;

// OgreBites

OgreBites::SdkTrayManager* mTrayMgr;

OgreBites::SdkCameraMan* mCameraMan;     // basic camera controller

OgreBites::ParamsPanel* mDetailsPanel;   // sample details panel

bool mCursorWasVisible;                  // was cursor visible before dialog appeared

bool mShutDown;

//OIS Input devices

OIS::InputManager* mInputManager;

OIS::Mouse*    mMouse;

OIS::Keyboard* mKeyboard;

};

这是我们利用(Visual Studio C++2010)生成的第一个Ogre的事例,相当于学习C/C++中的Hello World,从以上的函数的注释,可以看到每一个函数的意思,然后对应每个函数,在cpp文件中可以看到每个函数中的具体内容,在此不一一列举了(个人建议,看完Ogre的第一个程序之后,自己写几遍,本人第一个例子开始学习时,就写了七八遍,最好能了解每一行代码的意思,尤其是想要往图形渲染方向发展的同学,对今后学习Uniy3D以及虚幻引擎都有很大的帮助)。

下面我们就看看我们的第一个Ogre的程序的运行效果

我们可以看到当前窗口输出了一个“怪物”头像(事实上这是Ogre自身的吉祥物的头像),之前我们看到了在BaseApplication.h头文件中的代码,BaseApplication类中基本都是Ogre项目的制作的配置和运行函数,BaseApplication 类中的createScene()函数中可以编写想要在场景内放置的所有物体,而BaseApplication 类中virtual void createScene(void) = 0; 纯虚函数被其子类OgreApp3所继承,在OgreApp3中的createScene函数中的内容如下:

Ogre::Entity* ogreHead = mSceneMgr->createEntity("Head", "ogrehead.mesh"); Ogre::SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();

headNode->attachObject(ogreHead);

// Set ambient light

mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));

// Create a light

Ogre::Light* l = mSceneMgr->createLight("MainLight");

l->setPosition(20,80,50);

//上述代码的解释如下:

第一行首先创建一个实体对象,实体对象的名字为“Head”,采用的Ogrehead.mesh网格,也就是图中的“怪物”头像,然后用headNode节点绑定该实体ogreHead,如果不绑定是不会在窗口中显示的。

mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));设置场景内的环境光(可以调节参数看看有什么变化)。Ogre::Light* l = mSceneMgr->createLight("MainLight");创建了一个平行光。此为第一个Ogre窗口内的所有内容。

3.1.3  编写Ogre的样例的注意事项

在Ogre1.8.1的Sample样例中并不存在createScene函数,当我们仔细观察每一项目的时候会发现虽然不存在createScene函数,在每一个事例中的.h头文件中,以Sample_Grass.h为例,有一个名为setupContent的函数,这就相当于创建场景createScene函数,然后我们就可以把setupContent的函数体粘贴到我们自己创建的Ogre项目下的createScene函数体中进行编译生成,以此方法可以对Ogre样例中的每一个例子进行编译生成(粘贴只是学习Ogre前快速实现事例的方法,在实际学习的过程,代码必须要一行一行的敲,才能真正掌握)

3.2            Ogre的基本知识

3.2.1Ogre场景内的坐标

试想一下你站在Ogre坐标轴的原点,面向Z轴的正方向,你前面是Z轴的正方向,背后为Z轴的负方向,左手边为X轴的正方向,右手边为X轴的负方向,后面为Z轴的负方向,头顶为Y轴的正方向,脚下为Y轴的负方向。

3.2.2           利用Ogre生成Entity实体

如上图所示,在创建场景函数 中,利用了场景管理器(mSceneMgr)创建出一个实体指针(Entity*)的对象,就已经在场景内创建出了一个Ogre的吉祥物的头部,但是这是这样还不够,你虽然创建出了一个实体对象,但你并没有加到场景内的节点上,所有并不会在场景内进行显示,所有你还需要创建headNode这样一个节点,然后利用headNode这样一个节点绑定当前的实体对象ogreHead才能在场景内看到,你还可以通过headNode节点改变吉祥物头部的位置利用setPosition函数,还可以改变当前的方位利用setDirection函数,也可以改变当前头部的大小利用setScale函数等等;

3.2.3           Ogre中的节点SceneNode

在上图中 我们看到有这么一行

当前我们利用场景管理器先获得根节点mScene->getRootSceneNode(),然后通过根节点创建出一个子节点,事实上只要你需要,你可以在根节点下创建很多子节点,场景内的实体(Entity)以及粒子系统(Particle)只有挂在节点上才能在场景内看到。

3.2.4           利用Ogre生成灯光Light

在现实生活中,我们之所有能看得见一个物体,是因为有光线照射到它,通过漫反射和反射投射到我们的眼中,我们可以看到这个物体,试想在黑夜中没有光线的情况下,无论那个物体离你有多近,你都无法看到它,在Ogre引擎中也一样,不过此时Ogre中的主摄像机就是我们的眼睛,还以OgreApp3的createScene为例

当前如果注释掉createScene中创建灯光的函数,以及把当前的环境光设置为0(此时不能注释掉设置环境光的那一行,如果注释掉,其实还是有环境光的,只是系统默认环境光的参数为0.5),我们无论怎么移动当前的摄像机,这个吉祥物的头部一定是看不到的。当前我们只是看到的是在场景内设置了一个平行光,Ogre中的灯光模式有三种:①平行光②聚光灯③点光源;在学习时,可以试验一下

3.2.5           Ogre中的资源路径设置和读取

在上图中的createScene函数中,我们调用了生成实体的Ogrehead.mesh网格,我们为什么能够调用它呢?只要是写过几遍Ogre的第一个“hello world”程序的同学都会发现Ogre中有好几个外部的配置文件,以我们生成的Debug文件夹为例,在Debug文件夹下,Ogre程序的插件配置文件的信息都存在于文件中,Ogre程序调用的资源配置文件的路径都存在于文件中,比如说我们当前的所调用的吉祥物头部ogrehead的mesh网格的路径就存在于resources_d.cfg文件中。

绝对路径与相对路径

打开resouces_d.dll文件,会发现当前的资源文件夹的路径有很多,大多路径都是以“..\”开头,在读取时“..\”表示上级目录, “.\”表示当前目录下

资源文件的读取

打开资源文件resources_d.cfg文件,可以看到如下图所示:

红框处选中的部分就是ogrehead.mesh所在的路径,当然你可以试着查看当前的路径下是否存有ogrehead.mesh。

3.2.6           Ogre中的材质Material

可以利用代码设置Ogre中实体的材质,以OgreApp3的createScene函数为例,在函数体中增加设置材质的代码,如下图所示

图中显示利用物体实体指针对象(Entity*)可以通过调用资源文件中的材质脚本来手动设置实体自身的材质,材质脚本路径问题请查看3.2.4,设置完材质之后,窗口内的显示如下

可以看到当前物体的材质确实发生了变化,通过路径查的该脚本的内容如下

material Examples/BeachStones

{

technique

{

pass

{

ambient 0.1 0.1 0.1

texture_unit

{

texture BeachStones.jpg

}

}

}

}

可以看出当前材质的脚本的名字为Examples/BeachStones,其实材质脚本中如果不看环境光的变量时,材质脚本中仅仅调用了外部的BeachStones的jpg图片。

3.2.7           Ogre中的粒子系统ParticleUniverse

Ogre本身也可以编辑粒子系统,不过Ogre内部的粒子系统并没有想象中那么强大,我们可以使用Ogre的粒子插件ParticleUniverse来制作Ogre中的粒子系统; 首先来介绍下我们的粒子编辑器ParticleUniverseEditor, ParticleUniverseEditor是

我们的可视化编辑粒子系统的编辑器,如下图所示

上图为该软件正在播放的粒子系统(感觉还不错吧),编辑时,只需要选择如下图所示的步骤,而不需要手动的写代码。

在一个粒子系统编辑完成之后,会在脚本选项中,自动生成文件后缀为.pu格式的脚本文件

如下图所示

而后通过保存到Ogre的资源目录中就可以通过文件的名字进行调用了。

在调用之前首先要配置好ParticleUniverse的插件,首先把已经下载好的particleuniverse-ogre19-current中的sln打开进行编译一下会生成ParticleUniverse_d.dll文件,

需要把ParticleUniverse_d.dll放置在debug的目录中,然后在plugins_d.cfg中写入ParticleUniverse_d插件,然后将ParticleUniverse_d.lib与ParticleUniverse_d.exp放入到Ogre的库目录中,最后把你的项目属性中的C++附加依赖项添加路径particleuniverse-ogre19-current\Plugins\ParticleUniverse\src与

particleuniverse-ogre19-current\Plugins\ParticleUniverse\include

在链接库的附加依赖项加入 particleUniverse_d.lib

如下图所示的路径

以上是所有粒子系统的配置内容,接下来就可以调用我们之前调制好的粒子脚本,代码如下图所示:

在调用之前记得加上头文件#include<ParticleUniverseSystemManager.h>

效果图如下所示

3.2.8           Ogre中的合成器compositor

compositor允许用户在视口(Viewport)级别实现全屏的二维后处理(Postprocessing)特效。例如,你可以把视口中全屏的内容实现的发光或者朦胧处理、黑白渲染、锐化边缘渲染。任何你能想象的对整个视口的操作都可以在合成器框架中实现。

这种框架的处理方式极其类似材质脚本系统。其中合成器中的技术(Technique)概念和材质脚本中的渲染技术概念一样,都是指的达到某种特效所能使用的不同方法。合成器中的通路(Pass)也和材质脚本中的渲染通路有类似概念,既在创建视口最后的输出之前进行的多次运算或者过滤过程。并且合成器框架也提供了和材质脚本一样的自动回调技术来保证最终输出的像素各式可用.

以OgreApp3为例,在代码中添加一个灰色合成器,这样能使场景内的所有物体的材质的颜色都会变成灰色(就像电影特效一样)。

合成器脚本代码如下:

compositorMyFirstGreyCompositor

{

technique

{

texture scene target_width target_height PF_R8G8B8

target scene

{

input previous

}

target_output

{

input none;

pass render_quad

{

material MyFirstGreyMaterial

input 0 scene

}

}

}

}

合成器所调用材质的脚本如下:

fragment_program MyFirstGreyFragment cg

{

source MyFirstGreyFragmentShader.cg

entry_point MyFirstGreyFragmentShader_Main

profiles ps_2_0 arbfp1

}

material MyFirstGreyMaterial

{

technique

{

pass

{

fragment_program_ref MyFirstGreyFragment

{

}

texture_unit 0

{

}

}

}

}

合成器材质所调用的cg脚本如下:

void MyFirstGreyFragmentShader_Main(float2 uv : TEXCOORD0,out float4 color : COLOR,uniform sampler2D texture)

{

float4 temp_color=tex2D(texture,uv);

float greyvalue=(temp_color.r*0.3+temp_color*0.59+temp_color*0.11);

color=float4(greyvalue,greyvalue,greyvalue,0);

}

我们可以在createScene函数中调用合成器的代码:

void OgreApp3::createScene(void)

{

Ogre::Entity* ogreHead = mSceneMgr->createEntity("Head", "ogrehead.mesh");

Ogre::SceneNode* headNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(Ogre::Vector3(0,0,80));

headNode->attachObject(ogreHead);

// Set ambient light

mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));

// Create a light

Ogre::Light* l = mSceneMgr->createLight("MainLight");

l->setPosition(20,80,50);

//blackHole.pu

ParticleUniverse::ParticleSystemManager*mSmokeParticleMgr = ParticleUniverse::ParticleSystemManager::getSingletonPtr();

ParticleUniverse::ParticleSystem* blackHole = mSmokeParticleMgr->createParticleSystem("blackHole_First", "blackHole", mSceneMgr);

mSceneMgr->getRootSceneNode()->attachObject(blackHole);

blackHole->start();

Ogre::CompositorManager::getSingletonPtr()->addCompositor(mCamera->getViewport(), "MyFirstGreyCompositor");

Ogre::CompositorManager::getSingletonPtr()->setCompositorEnabled(mCamera->getViewport(), "MyFirstGreyCompositor", true);

}

效果图如下

比以前的图片变灰了。

3.2.9           Ogre的多视口的实现

下面我们利用Visual Studio2010新创建一个Ogre的项目,来实现我们的多个视口。我们就需要另外的摄像机以及另外的视口;我们在子类中重写我们的创建摄像机的方法,以及创建视口的方法,创建摄像机2号,以及视口2号。

重写创建摄像机函数的代码如下:

我们先保持第一个摄像机的属性不变,只是在场景中添加了新摄像机mSecondCamera,然后设置各项熟悉。

下面我们在子类中重写我们的创建视口的方法

把我们的第二个摄像机注入到新的视口中。

代码运行结果是从不同的方位观察同一个“怪物”的头部,如下图所示:

3.2.10     学习Ogre例子的个人心得

在学习Ogre事例时,无论是Ogre的第一个程序还是Ogre自身所带的事例,都应该多写几遍,毕竟书读百遍其义自见,本人第一次学习Ogre引擎是主要是为了实现仿真项目的工作,在学习之初,也是抱着很大的兴趣,但由于网上对Ogre的一些相关文档相当的欠缺,往往遇到的有些问题在网上查询Ogre的相关文档的时候,要么根本没有,要么论坛上根本回答不了重点问题,可能有些同学应该也有这样的体会吧,所以在学习Ogre中过程中,还是要发挥主观能动性,如果自己感觉这种方法可行,自己亲自实施一下,万一成功了呢?

在学习代码的时候,个人感觉没有什么捷径可走,唯一的方法就是多练习,我一直信仰如果你写够一定的代码,写代码时的解决思路一定能有所改变。

档铺网——在线文档免费处理

Ogre个人初步学习总结相关推荐

  1. HTMLParser的初步学习

    Python的自带模块--HTMLParser的初步学习 HTMLParser是Python自带的模块,使用简单,能够很容易的实现HTML文件的分析. 本文主要简单讲一下HTMLParser的用法. ...

  2. 初步学习pg_control文件之三

    接前文,初步学习pg_control文件之二 继续学习: 研究 DBState,先研究 DB_IN_PRODUCTION ,看它如何出现: 它出现在启动Postmaster时运行的函数处: /* * ...

  3. eclipsevue代码怎么运行_[Java教程]使用eclipse初步学习vue.js操作

    [Java教程]使用eclipse初步学习vue.js操作 0 2017-11-26 19:00:06 一.vue.js的初步认识 https://unpkg.com/vue ">vu ...

  4. json2.js的初步学习与了解(转)

    转载来源:http://apps.hi.baidu.com/share/detail/6092406 json2.js的初步学习与了解 1.)该js的下载地址是:http://www.json.org ...

  5. 【TensorFlow-serving】初步学习模型部署

    前言 初步学习tensorflow serving的手写数字识别模型部署.包括简单的模型训练.保存.部署上线.因为对docker和网络不太熟悉,可能会有部分错误,但是看完博客,能跑通整个流程.此博客将 ...

  6. 初步学习pg_control文件之八

    接前文  初步学习pg_control文件之七  继续 看:catalog_version_no 代码如下: static void WriteControlFile(void) {.../** In ...

  7. 初步学习pg_control文件之六

    接前文:初步学习pg_control文件之五 ,DB_IN_ARCHIVE_RECOVERY何时出现? 看代码:如果recovery.conf文件存在,则返回 InArchiveRecovery = ...

  8. 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助...

    初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: 1 var fs = require( ...

  9. 罗佳琪的第三次预备作业——虚拟机的安装及Linux的初步学习

    虚拟机的安装及Linux的初步学习 坎坷的安装过程 首先我按照老师给的基于VirtualBox虚拟机安装Ubuntu图文教程进行了下载,下载很顺利但是安装时出现了问题. 起初我以为是电脑位数问题,但我 ...

最新文章

  1. 【Linux】21.Linux输入输出重定向、2>1、标准输入、标准输出、标准错误
  2. invalid character found in the request target 异常
  3. dealloc时取weakself引起崩溃
  4. 长沙.NET社区之光
  5. Pytorch中CNN入门思想及实现
  6. 根据坐标如何在matlab中l连成曲线,matlab中,如何将两条曲线画在一个坐标系里,plot(x1,x2,y1,y2)还是怎样...
  7. mysql事物及事物等级_MySQL事物原理及事务隔离级别
  8. 发送邮件 ajax,使用Ajax发送电子邮件
  9. 亚马逊自动驾驶小车上线啦:才卖1700元,请叫它“强化学习玩具”
  10. 蠕虫Sexy View短信攻击诺基亚3250等手机
  11. ABAQUS盾构隧道开挖模型Cae文件,一环7片,含螺栓,配筋。 (此模型用的㎜单位制)
  12. 如何在计算机上设置禁止游戏,如何禁止玩电脑游戏 屏蔽网络游戏的方法
  13. python设置计算题_python tkinter做的生成计算题的GUI
  14. ansys里面自带chemkin_分析软件 - Ansys Chemkin Enterprise - ANSYS - 模拟 / 设计 / 流体
  15. javascript 关于年龄计算
  16. 基于微信小程序的流动人口管理移动APP设计与实现-计算机毕业设计源码+LW文档
  17. 强连通分量 圆桌骑士
  18. CATIA Composer三维作业指导书
  19. 虚拟机开摄像头问题解决方法
  20. linux系统制作usb启动盘,制作用U盘启动的Linux系统的简单步骤

热门文章

  1. 移动固态硬盘中安装Ubuntu18.04,并且运行于其他电脑
  2. php怎么用不了图像处理函数,php图像处理函数
  3. jupyter notebook内核挂了
  4. 搜索下半场:微信要做大搜索吗?
  5. 以数据赋能业务,qlik为企业搭建透明绩效管理平台
  6. dw网页设计期末设计一个网页_Dw网页设计制作九个小技巧,你都会吗?
  7. win10设置虚拟内存_原来win10这样设置,电脑就能释放30G,比win7运行还顺畅
  8. 洞态漏洞检出测试第二期:NoSQL LDAP注入漏洞
  9. 【Python爬虫实战】爬取IU高清大图
  10. 爬虫入门3---爬虫实战