Jump to content

May28

中级会员
  • 帖子总数

    741
  • 注册时间

  • 上次访问

博客条文 由 May28 发布的

  1. May28
    3D游戏角色动画

    作者:迷糊小亚

    QQ:183237048

    2006年6月8日

    时光飞逝,4年的大学生活已到尾声。我没有留下遗憾,因为我一直向着梦想努力,拼搏。游戏一直是我的梦;)以此文共勉我的同志,大家,不要放弃,一起加油!(本人水平有限,请游戏界的前辈们多多指点。)



    摘要:本文主要描述了3D游戏角色动画的原理及应用,从介绍微软的X文件到最为广泛应用的骨骼蒙皮动画,另外简要的介绍了下渐变动画的原理。





    关键词:Role Animation Skeletal Animation Morphing Animation Skinned Mesh



    Abstract:Introduce 3D Game Role Animation, for example Skeletal Animation and Skinned Mesh etc.



    目录:



    一 概述3D角色动画的应用



    二 3D游戏动画基础------基于时间的运动



    三 3D游戏角色动画

    1 介绍微软的X文件

    2 骨骼蒙皮动画的原理与实现

    3 增加场景数据

    4 简介渐变动画



    四 结束语

    *****************************************************




    正文:



    一 概述3D角色动画的应用

    3D角色动画是计算机动画技术的一个重要组成部分,也是计算机图形学的一个分支。无论是在离线渲染环境下,还是在实时渲染环境下,3D角色动画都得到了广泛的应用。在离线渲染环境下,主要应用于动画电影制作和各类广告制作。动画电影制作中所使用的3D角色动画技术的一个重要特点是动画数据量大,渲染需要耗费大量时间,因此动画作品必须预先制作,渲染,然后转化成视频文件播放。在实时渲染环境下,主要应用于虚拟现实,视频游戏,甚至是建模软件,动画制作软件。现在,随着计算机硬件技术的发展,特别是带有硬件加速功能的显卡性能的提高,很多曾经只能在离线环境下应用的技术,都转移到实时渲染环境中来。其中,实时渲染的角色动画技术得到了发展且被广泛的应用。目前,实时角色动画技术大体可分为三种类型。

    第一类是关节动画(Skeletal Animation)。关节动画中的角色由若干独立的部分组成。每一个部分对应着一个独立的网格模型,不同的部分按照角色的特点组织成一个层次结构。比如说,一个人体模型可以由头,上身,左上臂,左前臂,左手,右上臂,右前臂,右手,左大腿,左小腿,左脚,右大腿,右小腿,右脚等各部分组成。而某个部分,可能是另一个部分的子节点,同时又是另一个部分的父节点。比如上面的人体模型中,右前臂就是右上臂的子节点,同时也是右手的父节点。而右上臂是上身的子节点,后者则是躯体的子节点。通过改变不同部分之间的相对位置,比如夹角,位移等等,就可以实现所需要的各种动画效果。这类动画的优点很多。首先,在动画序列的关键帧中只需要存储节点间的相对变化,因此动画文件占用的空间很小。其次,可以实现很多复杂的动画效果,如果应用程序支持反向动力学还可以动态实现预先存储的动画序列之外的新的动画效果。当然这类动画也有不少缺点。其中之一是由于角色模型是一个层次模型,要获得某一个部分相对于世界坐标的位置,必须从根结点开始遍历该节点所有的祖先节点累计计算模型的世界变换。但最关键的问题是在不同部分的结合处往往会有很明显的接缝,这会严重的影响模型的真实感。

    第二类是渐变动画(Morphing Animation)。这种动画中的角色由一系列的渐变网格模型构成。在动画序列的关键帧中记录着组成网格的各个顶点的新位置或者是相对于原位置的改变量。通过在相邻关键帧之间插值来直接改变该网格模型中各个顶点的位置就可以实现动画效果。相对于关节动画,单一网格模型动画的角色看上去更真实,也不会有关节动画所面临的接缝问题。由于没有使用层次模型,获得模型网格顶点在世界坐标中位置的计算量也很小。但是,这类动画的适应性很弱,角色很难通过实时计算来与环境进行良好的互动,以获得预先存储的动画序列之外的动画效果。另一方面,由于关键帧要存储网格模型所有的顶点信息,动画文件占用的空间比较大。

    第三类是骨骼蒙皮动画(Skinned Mesh)。骨骼蒙皮动画可以看作是关节动画和渐变动画的结合。他同时兼有关节动画的灵活和渐变动画的逼真。后面将详细介绍骨骼蒙皮动画的技术细节。

    3D角色动画技术和其它动画技术相结合,就能创造出绚丽多彩的游戏世界。









    二 3D游戏动画基础------基于时间的运动

    在一个游戏项目中,计时扮演了一个重要的角色。基于时间的运动,也就是创建计时器来控制运动。它能够产生这样一种动画效果:同样处理10000毫秒的动画,在性能好的计算机上得到平滑完整的动画效果,在性能不好的计算机上显得跳帧,但也能够在10000毫秒的时候完成任务,和性能好的计算机是同步的。

    基本思路是事先设置好动画关键帧序列,在主循环中判断出第一个动画关键帧和下一个动画关键帧的编号,利用一个时间计数器去定位相对于第一动画关键帧的位置。随着时间计数器的增长,不断从第一个动画关键帧的位置移动至下一个动画关键帧的位置。主要分为以下几个步骤:

    1设置动画关键帧序列。

    2计算出每一帧的时间Time,Time是相对于程序开始运行的毫秒数。

    3定位出第一个动画关键帧和下一个动画关键帧。

    4利用Time计算出相对于第一个动画关键帧的毫秒数,再利用这个偏移毫秒数计算出相对于第一个动画帧的偏移位置。

    5设置变换矩阵。

    6回到第2步。





    上图表示了4帧的关键帧动画,其中第0帧和第3帧变换矩阵相同。下面直接看代码,我将结合代码详细叙述。



    typedef struct sKeyframe

    {

    DWORD Time;

    D3DMATRIX matTransformation;

    } sKeyframe;//关键帧的结构,DWORD Time为执行该帧的时间,D3DMATRIX //matTransformation为在该帧时模型的变换矩阵。



    sKeyframe g_Keyframes[4] =

    {

    // Keyframe 0, 0ms

    { 0, 1.000000f, 0.000000f, 0.000000f, 0.000000f,

    0.000000f, 1.000000f, 0.000000f, 0.000000f,

    0.000000f, 0.000000f, 1.000000f, 0.000000f,

    0.000000f, 0.000000f, 0.000000f, 1.000000f },

    // Keyframe 1, 40ms

    { 400, 0.000796f, 1.000000f, 0.000000f, 0.000000f,

    -1.000000f, 0.000796f, 0.000000f, 0.000000f,

    0.000000f, 0.000000f, 1.000000f, 0.000000f,

    50.000000f, 0.000000f, 0.000000f, 1.000000f },

    // Keyframe 2, 80ms

    { 800, -0.999999f, 0.001593f, 0.000000f, 0.000000f,

    -0.001593f, -0.999999f, 0.000000f, 0.000000f,

    0.000000f, 0.000000f, 1.000000f, 0.000000f,

    25.000000f, 25.000000f, 0.000000f, 1.000000f },

    // Keyframe 3, 120ms

    { 1200, 1.000000f, 0.000000f, 0.000000f, 0.000000f,

    0.000000f, 1.000000f, 0.000000f, 0.000000f,

    0.000000f, 0.000000f, 1.000000f, 0.000000f,

    0.000000f, 0.000000f, 0.000000f, 1.000000f }

    };//定义了4帧的关键动画。其中第3帧和第0帧的变换矩阵一样,为了使动画能进入循环状态。

    void DoFrame() //此函数在循环内

    {

    static DWORD StartTime = timeGetTime();

    DWORD Time = timeGetTime() - StartTime;

    //用timeGetTime()得到一个操作系统运行的毫秒数,储存到static变量以后将不再改变,//DWORD Time变量不断改变,为本程序运行的毫秒数。

    Time %= (g_Keyframes[3].Time+1);//得到一个不断从0到1200变化的毫秒数。

    DWORD Keyframe = 0; // 从第0帧开始。

    for(DWORD i=0;i<4;i++) {



    // 如果Time>= 某一关键帧的时间,将关键帧定位于此帧。

    if(Time >= g_Keyframes.Time)

    Keyframe = i;

    }



    DWORD Keyframe2 = (Keyframe==3) ? Keyframe:Keyframe + 1;//得到接下来的关键帧,如//果Keyframe为第3关键动画帧,Keyframe2也为第3关键动画帧。

    //当Keyframe=1200时这种情况才成立,几率很小。一般情况下,Keyframe2=Keyframe+1。

    DWORD TimeDiff = g_Keyframes[Keyframe2].Time -

    g_Keyframes[Keyframe].Time;

    if(!TimeDiff)

    TimeDiff=1;//计算两个sKeyframe的时间差,当Keyframe=Keyframe2=3时,TimeDiff=0,//此时另TimeDiff=1。

    float Scalar = (float)(Time - g_Keyframes[Keyframe].Time) / (float)TimeDiff; // Scalar取 //值为[0,1),利用Time计算出相对于Keyframe的偏移毫秒数,再除以两//帧的时间差。



    D3DXMATRIX matInt = D3DXMATRIX(g_Keyframes[Keyframe2].matTransformation) -

    D3DXMATRIX(g_Keyframes[Keyframe].matTransformation);

    matInt *= Scalar; //用于计算相对于Keyfrme的偏移位置。

    matInt += D3DXMATRIX(g_Keyframes[Keyframe].matTransformation); // 计算出该帧处相//对于Keyfrme的偏移位置。



    g_pD3DDevice→SetTransform(D3DTS_WORLD, &matInt); // 设置 world transformation matrix

    设置完变换矩阵,剩下的事情就只是渲染了。创建计时器控制动画的技术是非常简单有效的,这是现代计算机游戏动画的基础,因此,必须深刻理解它的内容。
  2. May28
    三 3D游戏角色动画

    1 介绍微软的X文件

    制作3D游戏角色动画需要与之相关的“动画容器”。这个“容器”中储存着动画的数据。微软的X文件正是这样的一种容器。由于微软的影响力,它们公司设计的X文件也广为流传。X文件是一套基于模版定义的文件,理论上它能够容纳任何数据。也就意味着不仅仅是3D模型文件,任何用于游戏引擎加载的外部资源都可以被包含于X文件之中。下面我们详细的介绍下X文件。为了得到一个直观的印象,我们首先浏览下它的全貌。



    xof 0302txt 0032



    template Header {

    <3D82AB43-62DA-11cf-AB39-0020AF71E433>

    DWORD major;

    DWORD minor;

    DWORD flags;

    }



    template Frame {

    <3D82AB46-62DA-11cf-AB39-0020AF71E433>

    [FrameTransformMatrix]

    [Mesh]

    }



    Header {

    1;

    0;

    1;

    }



    Frame Scene_Root {

    FrameTransformMatrix {

    1.000000, 0.000000, 0.000000, 0.000000,

    0.000000, 1.000000, 0.000000, 0.000000,

    0.000000, 0.000000, 1.000000, 0.000000,

    0.000000, 0.000000, 0.000000, 1.000000;;

    }

    Frame Pyramid_Frame {

    FrameTransformMatrix {

    1.000000, 0.000000, 0.000000, 0.000000,

    0.000000, 1.000000, 0.000000, 0.000000,

    0.000000, 0.000000, 1.000000, 0.000000,

    0.000000, 0.000000, 0.000000, 1.000000;;

    }

    Mesh PyramidMesh {

    5;

    0.00000;10.00000;0.00000;,

    -10.00000;0.00000;10.00000;,

    10.00000;0.00000;10.00000;,

    -10.00000;0.00000;-10.00000;,

    10.00000;0.00000;-10.00000;;

    6;

    3;0,1,2;,

    3;0,2,3;,

    3;0,3,4;,

    3;0,4,1;,

    3;2,1,4;,

    3;2,4,3;;

    MeshMaterialList {

    1;

    6;

    0,0,0,0,0,0;;

    Material Material0 {

    1.000000; 1.000000; 1.000000; 1.000000;;

    0.000000;

    0.050000; 0.050000; 0.050000;;

    0.000000; 0.000000; 0.000000;;

    }

    }

    }

    }

    }

    首先看头文件xof 0302txt 0032。xof表示这是一个真正的X文件。0302txt表示通知程序使用Directx的X文件,版本为3.2的模版,其中txt表示此文件为文本文件,可读,并非是一个2进制文件。0032表示一个浮点数的位数为32,如果想要用64位的浮点数,可以写成0064。

    下面我们将按照以下七个步骤进行介绍和说明。



    第一,声明一个模版:

    假设声明 template ContactEntry ,首先需要用guidgen.exe产生一个GUID。产生的GUID如下:

    // {4C9D055B-C64D-4bfe-A7D9-981F507E45FF}

    DEFINE_GUID(<<name>>,

    0x4c9d055b, 0xc64d, 0x4bfe, 0xa7, 0xd9, 0x98, \

    0x1f, 0x50, 0x7e, 0x45, 0xff);

    之后需要在程序代码中加入:

    #include "initguid.h"

    // At beginning of source code file - add DEFINE_GUIDs

    DEFINE_GUID(ContactEntry, \

    0x4c9d055b, 0xc64d, 0x4bfe, 0xa7, 0xd9, 0x98, \

    0x1f, 0x50, 0x7e, 0x45, 0xff);

    还要在X文件中加入:

    template ContactEntry {

    <4C9D055B-C64D-4bfe-A7D9-981F507E45FF>}

    这里介绍下声明模版用到的数据类型:

    关键字 描述

    WORD 16-bit value (short)

    DWORD 32-bit value (32-bit int or long)

    FLOAT IEEE float value (float)

    DOUBLE 64-bit floating-point value (double)

    CHAR 8-bit signed value (signed char)

    UCHAR 8-bit unsigned value (unsigned char)

    BYTE 8-bit unsigned value (unsigned char)

    STRING A NULL-terminated string (char[]))

    array Signifies an array of following data type to follow ([])

    使用数据类型的举例:

    DWORD Value;

    array STRING Text[20];//定义一个名为Text的数组,类型为STRING,大小为20。

    DWORD ArraySize; array STRING Names[ArraySize]; //可以将大小设置为变量。

    现在,我们声明一个ContactEntry模版:

    template ContactEntry {

    <4C9D055B-C64D-4bfe-A7D9-981F507E45FF>

    STRING Name; // The contact's name

    STRING PhoneNumber; // The contact's phone number

    DWORD Age; // The contact's age

    }

    实例化一个模版对象:

    ContactEntry JimsEntry {

    "Jim Adams";

    "(800) 555-1212";

    30;

    }

    {JimsEntry} 可以用这样的形式引用一个数据对象。例如,在一个animation sequence template中引用一个Frame data object做为其内嵌数据对象。也可以利用引用表示一个数据对象的副本,没有必要重复书写这个数据对象。



    第二,内嵌数据对象和模版约束:

    首先,我们分别声明了三个不同的模版,请仔细看它们的区别。

    template ClosedTemplate {

    <4C9D055B-C64D-4bfe-A7D9-981F507E45FF>

    DWORD ClosedData;

    }

    template OpenTemplate {

    <4C9D055B-C64D-4bff-A7D9-981F507E45FF>

    DWORD OpenData;

    [...]

    }

    template RestrictedTemplate {

    <4C9D055B-C64D-4c00-A7D9-981F507E45FF>

    DWORD RestrictedData;

    [ClosedTemplate]

    [OpenTemplate]

    }

    ClosedTemplate看起来没有什么不同,因为它就是标准的模版声明。在OpenTemplate中包含一个[...],表示这是一个开放模版。开放模版允许在[]中内嵌任何数据对象。例如,你可以实例化OpenTemplate,在里面定义一个OpenData变量和内嵌一个ClosedTemplate的实例。最后的RestrictedTemplate为约束模版。约束模版实例化时只允许包含它列出的数据对象,如,不能在RestrictedTemplate包含[ClosedTemplate],[OpenTemplate]以外的数据对象。



    第三,充分利用DirectX .X Standard Templates:

    正如上面提到的,X文件广泛用于包含一个mesh信息。一个Standard Templates包含了各种信息。

    Table 3: DirectX .X Standard Templates

    Template Name Description

    Animation: Defines animation data for a single frame.

    AnimationKey: Defines a single key frame for the parent animation template.

    AnimationOptions: Contains animation playback information.

    AnimationSet: Contains a collection of animation templates.

    Boolean: Holds a Boolean value.

    Boolean2d: Holds two Boolean values.

    ColorRGB: Contains red, green, and blue color values.

    ColorRGBA: Contains red, green, blue, and alpha color values.

    Coords2d: Defines two coordinate values.

    FloatKeys: Contains an array of floating-point values.

    FrameTransformMatrix: Holds the transformation matrix for a parent Frame template.

    Frame: A frame-of-reference template that defines a hierarchy.

    Header: The .X file header that contains version numbers.

    IndexedColor: Contains an indexed color value.

    Material: Contains material color values.

    Matrix4x4: Holds a 4x4 homogenous matrix container.

    Mesh: Contains a single mesh's data.

    MeshFace: Holds a mesh's face data.

    MeshFaceWraps: Contains the texture wrapping for mesh faces.

    MeshMaterialList: Contains the material for face-mapping values.

    MeshNormals: Holds normals used for mesh data.

    MeshTextureCoords: Holds texture coordinates used for mesh data.

    MeshVertexColors: Holds vertex color information used for mesh vertices.

    Patch: Defines a control patch.

    PatchMesh: Contains a patch mesh (much like the Mesh template).

    Quaternion: Holds a quaternion value.

    SkinWeights: Contains an array of weight values mapped to a mesh's vertices. Used in skinned meshes.

    TextureFilename: Contains the texture file name to use for a material.

    TimedFloatKeys: Contains an array of FloatKeys templates.

    Vector: Holds a 3D coordinate value.

    VertexDuplicationIndices: Informs you which vertices are duplicates of other vertices.

    XSkinMeshHeader: Used by skinned meshes to define the number of bones contained in a mesh.

    我们可以在DirectX9SDK的安装目录下搜索到“rmxfguid.h”字样的头文件。在rmxfguid.h中定义了各个模版的宏,例如:

    /* {3D82AB44-62DA-11cf-AB39-0020AF71E433} */

    DEFINE_GUID(TID_D3DRMMesh,

    0x3d82ab44, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33);

    每个模版名加上前缀TID_D3DRM就是宏定义名。既然微软已经帮助我们定义了那么多的模版,我们可以根据需求,充分的去利用这些模版。另外,这些模版往往会有相关的帮助函数,我们使用它们可以事半功倍。



    第四,创建X文件接口:

    我们已经对X文件的模版概念有所了解,现在将使用它们。当然,要想使用首先得访问X文件。访问任何X文件首先要调用DirectXFileCreate函数创建一个IDirectXFile接口,这个接口就代表了一个X文件。

    IDirectXFile *pDXFile = NULL;

    HRESULT Result = DirectXFileCreate(&pDXFile);//用&pDXFile返回指向接口的指针。用SUCCEEDED或者FAILED宏判断返回值是否有效。

    创建完IDirectXFile接口,我们要注册一个定制模版或者标准模版。定制模版是自己定义的模版,标准模版是微软帮我们定义的模版,其实它们之间没有本质的区别,你现在要做的就是告诉IDirectXFile接口,使用二者之中的哪种。

    如何注册定制模版呢?下面举个例子更容易理解。你可以把X文件中的模版移除,直接在代码里定义那些模版。IDirectXFile接口支持这样的特性。需要调用IDirectXFile::RegisterTemplates函数。

    HRESULT IDirectXFile::RegisterTemplates(

    LPVOID pvData, // 一个定义模版数据的缓存,应该精确无误。

    DWORD cbSize); // pvData缓存的字节数。

    可以如下定义一个模版数据:

    char *Templates = "

    "xof 0303txt 0032 \ //标准X文件头。

    template CustomTemplate { \

    <4c944580-9e9a-11cf-ab43-0120af71e433> \

    DWORD Length; \

    array DWORD Values[Length]; \

    }";

    之后在用RegisterTemplates将其注册:

    pFile→RegisterTemplates(Templates, strlen(Templates));

    如何注册标准模版呢?首先需要在代码中包含rmxfguid.h和rmxftmpl.h。rmxfguid.h定义了各个标准模版的GUDI,rmxftmpl.h以2进制数据形式定义了标准模版数据的缓存和其字节数。然后调用RegisterTemplates将其注册:

    pFile→RegisterTemplates(D3DRM_XTEMPLATES, \

    D3DRM_XTEMPLATE_BYTES);
  3. May28
    2 骨骼动画的原理与实现

    这里的骨骼蒙皮动画特指skinnd mesh,也叫骨骼动画。无论是合金装备,波斯王子,还是魔兽世界,到处都是骨骼动画技术的运用。用它塑造了各种各样,栩栩如生的生物。其中,人类体格的骨骼动画运用最为广泛。现在让我们一步一步揭开它神秘的面纱。

    从本质上来讲,所有的3D角色动画系统都是基于一种逻辑,就是用一定的方法去改变Mesh顶点的位置,只是具体改变的方法不同而已。骨骼动画也是一样的。

    骨骼动画的基本原理就是首先控制各个骨骼和关节,再使符在上面的skinned mesh与其匹配。在骨骼蒙皮动画中,一个角色由作为皮肤的单一网格模型和按照一定层次组织起来的骨骼组成。骨骼层次描述了角色的结构,就像关节动画中的不同部分一样,骨骼蒙皮动画中的骨骼按照角色的特点组成一个层次结构。相邻的骨骼通过关节相连,并且可以作相对的运动。通过改变相邻骨骼间的夹角,位移,组成角色的骨骼就可以做出不同的动作,实现不同的动画效果。皮肤则作为一个网格蒙在骨骼之上,规定角色的外观。这里的皮肤不是固定不变的刚性网格,而是可以在骨骼影响下变化的一个可变形网格。组成皮肤的每一个顶点都会受到一个或者多个骨骼的影响。在顶点受到多个骨骼影响的情况下,不同的骨骼按照与顶点的几何,物理关系确定对该顶点的影响权重,这一权重可以通过建模软件计算,也可以手工设置。通过计算影响该顶点的不同骨骼对它影响的加权和就可以得到该顶点在世界坐标系中的正确位置。动画文件中的关键帧一般保存着骨骼的位置,朝向等信息。通过在动画序列中相邻的两个关键帧间插值可以确定某一时刻各个骨骼的新位置和新朝向。然后按照皮肤网格各个顶点中保存的影响它的骨骼索引和相应的权重信息可以计算出该顶点的新位置。这样就实现了在骨骼驱动下的单一皮肤网格变形动画。或者简单地说骨骼蒙皮动画。骨骼蒙皮动画的效果比关节动画和单一网格动画更逼真,更生动。而且,随着3D硬件性能的提高,越来越多的相关计算可以通过硬件来完成,骨骼蒙皮动画已经成为各类实时动画应用中使用最广泛的动画技术。

    下面讨论骨骼蒙皮动画实现的技术细节。在一个典型的骨骼蒙皮动画模型文件中,会保存如下信息:网格信息,骨骼信息和动画信息。网格信息是角色的多边形模型。该多边形模型一般由三角形面片组成,每一三角形面片有三个指向模型的顶点表的索引。通过该索引,可以确定该三角形的三个顶点。顶点表中的每一顶点除了带有位置,法向量,材质,纹理等基本信息外,还会指出有哪些骨骼影响了该顶点,影响权重又是多少。影响一个顶点的最大骨骼数一般取决于模型的设计和目标硬件平台的限制。比如,对于一个典型的人体骨架,一般只有在关节附近的顶点才会受到相邻几块骨骼的影响,而同时影响某一顶点的骨骼数,也不会超过四块。骨骼信息包括全部骨骼的数量和每一骨骼的具体信息。所有的骨骼按照父子关系组织成一棵树。树根代表整个骨架,其余每一节点包括叶子节点代表一根骨骼。每一根骨骼包括该骨骼在父骨骼坐标系中的变换矩阵,通过该变化矩阵确定了该骨骼在父骨骼坐标系中的位置。在动画信息中则保存了若干关键帧。每一关键帧指出了每一骨骼在该时刻相对于父骨骼坐标系的变换矩阵,当然也可以是该骨骼相对于父骨骼的位置,朝向等变动。在播放动画序列中的任一时刻:

    1)首先确定该时刻之前和之后的两个关键帧,然后按照该时刻与前后两个关键帧时刻的时间值插值计算出该时刻该骨骼相对于父骨骼的新变换矩阵,这个变换矩阵往往代表旋转变换,放缩变换也能接受,如果是平移变换矩阵,很容易将Mesh四分五裂。

    2)对于皮肤网格中的每一个顶点,计算它在世界坐标中新的位置和朝向。首先找到影响该顶点的所有骨骼。然后计算每一骨骼对该顶点的影响。也就时说,计算在该骨骼独立作用下顶点的新位置。计算按照如下公式:

    顶点的新位置 = 最初状态顶点的位置* 最初状态骨骼世界变换矩阵的逆矩阵* 骨骼的新变换矩阵(I)

    然后将所有这些新位置按照每一骨骼的影响权重加权求和。注意所有权重的和应该恰好为 1。在公式(I)中,最初状态顶点的位置为什么首先要与最初状态骨骼世界变矩阵的逆矩阵相乘呢?前面说过,骨骼的新变换矩阵是相对于父骨骼变换的,另一方面这个新变换矩阵是世界变换矩阵,它的任何变换是相对于世界坐标系原点的。因此需要把最初状态顶点移动到相当于父骨骼节点是原点的位置上,再进行矩阵变换。

    3)根据网格模型顶点的新位置和朝向绘制角色网格。

    下面我们结合具体的图形API环境(Direct3D)来进一步介绍骨骼动画。

    第一,了解骨骼结构(Skeletal Structures)和骨层级(Bone Hierarchies):

    骨骼结构就是连续很多的骨头(Bone)相结合,形成的骨层级。第一个骨头叫做根骨(root bone),是形成骨骼结构的关键点。其它所有的骨骼作为孩子骨(child bone)或者兄弟骨(sibling bone)附加在根骨之上。所谓的“骨”用一个帧(frame)对象表示。在Directx中,用一个D3DXFRAME结构或者X文件中的Frame template来表示帧对象。下面看一下Frame template和D3DXFRAME结构的定义:

    template Frame
    {
    < 3D82AB46-62DA-11cf-AB39-0020AF71E433 >
    FrameTransformMatrix frameTransformMatrix; // 骨骼相对于父节点的坐标变换矩阵,就是一个matrix
    Mesh mesh; // 骨骼的Mesh
    }



    typedef struct _D3DXFRAME
    {
    LPSTR Name; // 骨骼名称
    D3DXMATRIX TransformationMatrix; // 相对与父节点的坐标变换矩阵

    LPD3DXMESHCONTAINER pMeshContainer; // LPD3DXMESHCONTAINER对象,

    //用来加载MESH,还有一些附加属性,见SDK

    struct _D3DXFRAME *pFrameSibling; // 兄弟节点指针,和下面的子节点指针

    // 一块作用构成骨骼的层次结构。
    struct _D3DXFRAME *pFrameFirstChild; // 子节点指针
    } D3DXFRAME, *LPD3DXFRAME;



    注意D3DXFRAME * pFrameSibling和D3DXFRAME * pFrameFirstChild,主要是利用这两个指针形成骨层级。pFrameSibling把一个骨头连接到兄弟层级,相对的,pFrameFirstChild把一个骨头连接到子层级。通常,你需要用建模软件为你的程序创建那些骨骼结构,输出骨层级到X文件以便使用。Microsoft有3D Studio Max和Maya的输出插件(exporter),可以输出骨骼和动画数据到X文件。很多建模程序也都有这样的功能。

    X文件包含了帧数据,用一个帧(frame)模版的数据对象层级代表骨骼层级。如下图:





    注意上面的图,利用D3DXFRAME pointers指针形成了一个兄弟帧和孩子帧的链表。

    在前面template Frame中已经提及过每个Frame数据对象中存放着一个变换矩阵,这个矩阵描述了该骨骼相对于父骨骼的位置。另外在根Frame数据对象中内嵌了一个标准的Mesh数据对象。Frame定义了骨骼的层级,而Mesh中的SkinWeights数据对象定义了Frame代表的骨头。我们用D3DXFRAME结构容纳从X文件加载进来的Frame数据对象。为了更好的容纳Frame数据对象,我们需要扩展下D3DXFRAME结构:



    struct D3DXFRAME_EX : D3DXFRAME



    {



    D3DXMATRIX matCombined; // 组合变换矩阵,用于储存变换的骨骼矩阵



    D3DXMATRIX matOriginal; // 从X文件加载的原始变换矩阵







    D3DXFRAME_EX()



    {



    Name = NULL;



    pMeshContainer = NULL;



    pFrameSibling = pFrameFirstChild = NULL;



    D3DXMatrixIdentity(&matCombined);



    D3DXMatrixIdentity(&matOriginal);



    D3DXMatrixIdentity(&TransformationMatrix);



    }







    ~D3DXFRAME_EX()



    {



    delete [] Name; Name = NULL;



    delete pFrameSibling; pFrameSibling = NULL;



    delete pFrameFirstChild; pFrameFirstChild = NULL;



    }



    }

    利用我们以前介绍的cXParse类可以遍历X文件的数据对象,从而加载出Frame数据对象。下面的代码都是写在方法ParseObject中,如下:

    // 判断当前分析的是不是Frame节点
    if( objGUID == TID_D3DRMFrame )
    {

    // 引用对象直接返回,不需要做分析。一个数据段实际定义一次后可以被其他模板引用,例

    //如后面的Animation动画模板就会引用这里的Frame

    // 节点,标识动画关联的骨骼。
    if( pDataObj→IsReference() )
    return true;

    // D3DXFRAME_EX为D3DXFRAME的扩展结构,增加些数据成员

    D3DXFRAME_EX *pFrame = new D3DXFRAME_EX();

    // 得到名称
    pFrame→Name = GetObjectName( pDataObj );

    // 注意观察文件就可以发现一个Frame要么是根Frame,父节点不存在, 要么作为某

    //个Frame的孩子Frame而存在。
    if( NULL == pData )
    {
    // 作为根节点的兄弟节点加入链表。
    pFrame→pFrameSibling = m_pRootFrame;
    m_pRootFrame = pFrame;
    pFrame = NULL;

    // 将自定义数据指针指向自己,供子节点引用。
    pData = ( void** )&m_pRootFrame;
    }
    else
    {
    // 作为传入节点的子节点
    D3DXFRAME_EX *pDataFrame = ( D3DXFRAME_EX* )( *pData );
    pFrame→pFrameSibling = pDataFrame→pFrameFirstChild;
    pDataFrame→pFrameFirstChild = pFrame;
    pFrame = NULL;

    pData = ( void** )&pDataFrame→pFrameFirstChild;
    }
    }

    记住我们只需要做一件事情,判断类型,分配匹配的对象然后拷贝数据,下面来分析Frame中的matrix,

    // frame的坐标变换矩阵, 因为matrix必然属于某个Frame所以pData必须有效
    else if( objGUID == TID_D3DRMFrameTransformMatrix && pData )
    {
    // 我们可以肯定pData指向某个Frame
    D3DXFRAME_EX *pDataFrame = ( D3DXFRAME_EX* )( *pData );

    // 先取得缓冲区大小,应该是个标准的4x4矩阵
    DWORD size = 0;
    LPCVOID buffer = NULL;

    hr = pDataObj→Lock( &size, &buffer );
    if( FAILED( hr ) )
    return false;

    // 拷贝数据
    if( size == sizeof( D3DXMATRIX ) )
    {
    memcpy( &pDataFrame→TransformationMatrix, buffer, size );
    pDataObj→Unlock();

    pDataFrame→matOriginal = pDataFrame→TransformationMatrix;
    }
    }
  4. May28
    第五,打开X文件:

    创建完IDirectXFile接口,注册模版之后需要打开X文件,枚举其数据对象。调用IDirectXFile::CreateEnumObject函数。

    HRESULT IDirectXfile::CreateEnumObject(LPVOID pvSource, // .X filename

    DXFILELOADOPTIONS dwLoadOptions, // Load options

    LPDIRECTXFILEENUMOBJECT* ppEnumObj); // Enum interface

    当调用CreateEnumObject函数,用pvSource指定一个文件的名字,用ppEnumObj返回一个枚举对象接口指针。用dwLoadOptions指定load操作方式。当指定DXFILELOAD_FROMFILE值,告诉DirectX从磁盘载入一个文件。还有DXFILELOAD_FROMRESOURCE,DXFILELOAD_FROMMEMORY和DXFILELOAD_FROMURL分别表示从一个资源,内存缓冲和Internet上加载X文件。当从Internet加载文件时,需要为其指定完整的网址。

    下面代码从磁盘加载X文件:

    // Filename = filename to load ("test.x" for example)

    IDirectXFileEnumObject *pEnum;

    pFile→CreateEnumObject((LPVOID)Filename, \

    DXFILELOAD_FROMFILE, &pEnum);

    Filename指向一个有效的文件名,pEnum返回一个枚举对象接口指针。



    第六,枚举数据对象:

    注册完模版,打开X文件并且得到一个枚举对象接口,下面需要从X文件读出数据。枚举对象接口指针指向文件的第一个数据对象,因为每一个数据对象可能包含内嵌数据对象或者引用的数据对象,所以与第一个数据对象同在一层级的其它数据对象为同层级数据对象。至于包含的子数据对象的类型,需要对其分别的行进询问。可以使用HRESULT IDirectXFileEnumObject::GetNextDataObject (LPDIRECTXFILEDATA* ppDataObj)得到一个IDirectXFileData接口。它只有一个参数:

    IDirectXFileData *pData;

    HRESULT hr = pEnum→GetNextDataObject(&pData);

    利用此函数,可以不断地访问同一层级的数据对象接口,具体代码如下:

    while(SUCCEEDED(pEnum→GetNextDataObject(&pData))) {

    // 这里可以对pData数据对象进行操作。

    pData→Release();//释放接口。

    }

    当返回值为FAILED,表示已经访问完所有的接口。当访问值为SUCCEEDED,你需要继续判断这个数据对象是否包含子对象。利用接口IDirectXFileObject,和HRESULT IDirectXFileData::GetNextObject( LPDIRECTXFILEOBJECT* ppChildObj)函数,代码如下:

    IDirectXFileObject *pObject;

    while(SUCCEEDED(pData→GetNextObject(&pObject)))

    {

    // 如果一个子对象存在,需要继续询问它,判断出它的类型为内嵌数据对象或者引用的数

    // 据对象。

    pObject→Release();// 释放接口。

    }

    接下来询问接口,看其是否为内嵌数据对象:

    IDirectXFileData *pSubData;

    if(SUCCEEDED(pObject→QueryInterface( \

    IID_IDirectXFileData, (void**)&pSubData))) {

    // 如果询问内嵌数据对象成功,可以对pSubData数据对象进行操作

    pSubData→Release();//释放接口。

    }

    看其是否为引用数据对象:

    IDirectXFileDataReference *pRef;

    IDirectXFileData *pSubData;

    if(SUCCEEDED(pSubObj→QueryInterface( IID_IDirectXFileDataReference, \

    (void**)&pRef))) {

    // 如果询问引用的数据对象成功,解析出引用的原型。

    pRef→Resolve(&pSubData);

    //这里可以对pData数据对象进行操作。

    pRef→Release();

    pSubData→Release();//释放接口。

    }

    现在整理下思路:大体的思路其实很简单,首先枚举最顶层的数据对象,然后判断其是否有子对象,这个子对象可能是内嵌对象或者引用对象二者之一,分别询问其接口,就可以判断出具体的类型。

    下面是完整的Parse模版的函数:

    BOOL Parse(char *Filename)

    {

    IDirectXFile *pFile = NULL;

    IDirectXFileEnumObject *pEnum = NULL;

    IDirectXFileData *pData = NULL;

    if(FAILED(DirectXFileCreate(&pFile)))

    return FALSE;

    //注册标准模版。

    if(FAILED(pFile→RegisterTemplates( \

    (LPVOID)D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES)))

    return FALSE;

    //创建一个枚举对象接口。

    if(FAILED(pDXFile→CreateEnumObject((LPVOID)Filename, \

    DXFILELOAD_FROMFILE, \

    &pEnum))) {

    pFile→Release();

    return FALSE;

    }

    // 遍历所有的顶层数据对象。

    while(SUCCEEDED(pEnum→GetNextDataObject(&pData))) {

    // 用ParseObject解析其子数据对象。

    ParseObject(pData);

    pData→Release();

    }

    pEnum→Release();

    pFile→Release();

    return TRUE;

    }

    这个函数的主要部分在ParseObject(pData),它负责解析子数据对象:

    void ParseObject(IDirectXFileData *pData)

    {

    IDirectXFileObject *pObject = NULL;

    IDirectXFileData *pSubData = NULL;

    IDirectXFileDataReference *pRef = NULL;

    while(SUCCEEDED(pData→GetNextObject(&pObject))) {

    if(SUCCEEDED(pObject→QueryInterface( IID_IDirectXFileDataReference, (void**)&pRef))) {

    pRef→Resolve(&pSubData);

    ParseObject(pSubData);

    pSubData→Release();

    pRef→Release(); }

    if(SUCCEEDED(pObject→QueryInterface( IID_IDirectXFileData, (void**)&pSubData))) {

    ParseObject(pSubData);

    pSubData→Release();

    }

    pObject→Release();

    }

    }

    这是个递归函数,调用函数自身。判断子对象的类别,对其继续解析,直到返回值为FAILED,表示已没有子对象。从上面可以看出,这个函数除了枚举所有的对象,并没有做任何事情,下面就要从这些数据对象检索数据。



    第七,从数据对象检索数据:

    当你用IDirectXFileData接口指针指向一个有效的数据对象,可以调用IDirectXFileData::GetName函数得到该数据对象的名字。函数原型为:

    HRESULT IDirectXFileData::GetName(

    LPSTR pstrNameBuf, // 名字缓冲

    LPDWORD pdwBufLen); // 名字缓冲的大小

    可以这样使用这个函数:

    DWORD Size;

    pData→GetName(NULL, &Size);

    char *Name = new char;

    pData→GetName(Name, &Size);

    首先声明一个DWORD Size变量,调用GetName函数时将第一个参数设为NULL,在Size返回名字缓冲的大小。之后利用这个Size值创建存放名字的缓冲,再调用GetName在Name中返回数据对象的名字。

    得到了数据对象的名字,你需要得到这个数据对象的模版GUID,去判断这个数据对象是否为你想使用的那个模版的数据对象。利用IDirectXFileData::GetType函数,其原型为:

    HRESULT IDirectXFileData::GetType(const GUID ** ppguid);

    可以这样使用这个函数:

    const GUID *TemplateGUID = NULL;

    pData→GetType(&TemplateGUID);//在TemplateGUID中返回该数据对象对应模版的GUID。

    现在去匹配这个GUID,看它是否为你想使用的模版的数据对象。

    if(*TemplateGUID == TID_D3DRMMeshNormals) {

    // 如果匹配成功,这里可以继续处理这个模版的数据对象。

    }

    最后将介绍GetData函数,用它真正的得到了数据对象的数据。其原型为:

    HRESULT IDirectXFileData::GetData(

    LPCSTR szMember, // 设置为NULL

    DWORD *pcbSize, // 数据的大小

    void **ppvData); // 数据指针

    下面介绍用GetData得到数据对象结构的大小和数据对象的数据。

    假设有这样一个颜色的模版:

    template ColorRGBA {

    <35FF44E0-6C7C-11cf-8F52-0040333594A3>

    FLOAT red;

    FLOAT green;

    FLOAT blue;

    FLOAT alpha;

    }

    你想访问基于此模版的数据对象的数据你可以这样做:

    DWORD DataSize;

    float *DataPtr;

    pData→GetData(NULL, &DataSize, (void**)&DataPtr);

    float red = *DataPtr++;

    float green = *DataPtr++;

    float blue = *DataPtr++;

    float alpha = *DataPtr++;

    得到指向数据对象的数据的指针后,就像访问一般的结构一样简单。当然,你可以做得更直接:

    typedef struct {

    float red, green, blue, alpha;

    } sColorRGBA;//定一个结构方便访问数据对象的数据。

    sColorRGBA *Color;

    DWORD DataSize;

    pData→GetData(NULL, &DataSize,(void**)&Color);

    这样访问数据时更直接:

    float red = Color→red;

    float blue = Color→blue;

    float green = Color→green;

    float alpha = Color→alpha;

    访问单个变量是很简单的,下面继续介绍访问数组或字符串。

    访问数组:

    DWORD DataSize;

    DWORD *DataPtr;

    pData→GetData(NULL, &DataSize, (void**)&DataPtr);

    DWORD NumKeys = *DataPtr++;

    for(DWORD i=0;i<NumKeys;i++) {

    float fValue = *(FLOAT*)DataPtr++;

    访问字符串:

    DWORD DataSize;

    DWORD *DataPtr;

    pData→GetData(NULL, &DataSize, (void**)&DataPtr);

    char *StringPtr = (char*)DataPtr;

    MessageBox(NULL, StringPtr, "Texture Filename", MB_OK);

    为了访问数组或字符串,其本质就是把指针转化成匹配的类型,方便指针的定位操作。



    至此,我们已经介绍了X文件的使用方法,X文件是动画模型的载体,所以有必要了解它,进而才能更好的操作它。同时也为后面的动画技术做好了准备。
  5. May28
    第二,修改和更新骨骼层级:

    加载完骨骼层级之后,你可以操作它,更改骨骼的方位。你需要创建一个递归函数,按照名字找到相应的Frame数据对象。这个函数如下:

    D3DXFRAME_EX *FindFrame(D3DXFRAME_EX *Frame, char *Name)

    {

    if(Frame && Frame−>Name && Name) {

    // 如果名字找到,返回一个Frame指针

    if(!strcmp(Frame−>Name, Name)) // strcmp函数比较两个字符串,如果两个字符串相等,返回0

    return Frame;

    }

    // 在sibling frames找匹配的名字

    if(Frame && Frame−>pFrameSibling) {

    D3DXFRAME_EX *FramePtr = \

    FindFrame((D3DXFRAME_EX*)Frame−>pFrameSibling, \

    Name);

    if(FramePtr)

    return FramePtr;

    }

    // 在child frames找匹配的名字

    if(Frame && Frame−>pFrameFirstChild) {

    D3DXFRAME_EX *FramePtr = \

    FindFrame((D3DXFRAME_EX*)Frame−>pFrameFirstChild, \

    Name);

    if(FramePtr)

    return FramePtr;

    }

    // 如果没有找到,返回 NULL

    return NULL;

    }

    如果你想找到一个叫“Leg”的Frame,可以把“Leg”传入FindFrame函数,并且提供指向RootFrame的指针:

    // pRootframe 为D3DXFRAME_EX root frame 指针

    D3DXFRAME_EX *Frame = FindFrame(pRootFrame, "Leg");

    if(Frame) {

    // 可以在这里做一些处理,比如旋转操作

    // 你在这里可以稍微的旋转这个骨头

    D3DXMatrixRotationY(&Frame−>TransformationMatrix, 1.57f);

    }

    一旦你修改变换骨头,你需要更新整个骨骼层级,也就是把变换的组合矩阵存入D3DXFRAME_EX结构的matCombined成员中,用于后面的渲染。下面的函数应该增加到D3DXFRAME_EX结构中,如下:

    void UpdateHierarchy(D3DXMATRIX *matTransformation = NULL)

    {

    D3DXFRAME_EX *pFramePtr;

    D3DXMATRIX matIdentity;

    // 如果为空,用一个全同矩阵

    if(!matTransformation) {

    D3DXMatrixIdentity(&matIdentity);

    matTransformation = &matIdentity;

    }

    // 把变换矩阵组合到matCombined中

    matCombined = TransformationMatrix * (*matTransformation);

    // 更新兄弟层级

    if((pFramePtr = (D3DXFRAME_EX*)pFrameSibling))

    pFramePtr→UpdateHierarchy(matTransformation);

    // 更新孩子层级

    if((pFramePtr = (D3DXFRAME_EX*)pFrameFirstChild))

    pFramePtr→UpdateHierarchy(&matCombined);

    }

    现在matCombined储存着每个骨骼相对于原点的变换矩阵,然后只要把各个顶点附在相应的骨骼上,就能渲染了。



    第三,使用蒙皮网格:

    网格可以分为蒙皮网格(Skin Mesh)和普通网格(Mesh)。蒙皮网格就是具有蒙皮信息的普通网格。为了搞清楚蒙皮网格我们需要介绍相关的三个模版:

    template Mesh

    {

    <3D82AB44-62DA-11CF-AB39-0020AF71E433>

    DWORD nVertices; //顶点数

    array Vector vertices[nVertices]; //顶点坐标数组

    DWORD nFaces; //多边形数

    array MeshFace faces[nFaces]; //多边形顶点引索

    [...]

    }
    这个模板存储一个表态的网格和网格的材质。在骨骼蒙皮动画中,整个角色只是一个网格,由蒙皮信息确定网格中的每一个部分如何受到骨骼的影响。网格在内部会分成几个子集,每一个子集将受到一些特定骨骼的影响。
    template XSkinMeshHeader

    {

    < 3CF169CE-FF7C-44ab-93C0-F78F62D172E2 >

    WORD nMaxSkinWeightsPerVertex; // 网格中受到骨骼影响的顶点数

    WORD nMaxSkinWeightsPerFace; // 网格中受到骨骼影响的多边形数

    WORD nBones; // 影响网格顶点的骨骼数量

    }

    这个模版包含于Mesh模版中。包含关于蒙皮信息的属性。
    template SkinWeights

    {

    < 6F0D123B-BAD2-4167-A0D0-80224F25FABB >

    STRING transformNodeName; //骨骼的名字

    DWORD nWeights; //附属到该骨骼的顶点数

    array DWORD vertexIndices[nWeights]; //附属到该骨骼的顶点引索

    array float weights[nWeights]; //相应引索的顶点权值

    Matrix4x4 matrixOffset; //相对于骨骼位置的偏移矩阵

    }

    这个模版也包含于Mesh模版中,真正的蒙皮信息就存储在这里。每一个影响到网格的骨骼在模版中都有实例。例如有12个骨骼影响到网格,Mesh模版里将有12个SkinWeights模版的实例。

    蒙皮网格和普通网格的唯一不同点就是看XskinMeshHeader和SkinWeights模版是否存在。如果把这两个模版从任何一个蒙皮网格里面移走的话,就可以得到一个普通网格。在X文件中,我们将会发现一个GUID为TID_D3DRMMesh的模版,这表示模版里面存有一个网格。利用D3D的帮助函数D3DXLoadSkinMeshFromXof将会加载蒙皮网格和其它补充性数据。只需要向它传递一个IDirectXFileData指针,然后它将为你做剩下的事情。现在介绍下D3DXLoadSkinMeshFromXof函数:

    HRESULT D3DXLoadSkinMeshFromXof(

    LPD3DXFILEDATA pxofMesh, //X文件数据接口

    DWORD Options, //加载参数

    LPDIRECT3DDEVICE9 pD3DDevice, //使用的三维设备

    LPD3DXBUFFER * ppAdjacency, //邻接信息缓冲接口

    LPD3DXBUFFER * ppMaterials, //材质缓冲接口

    LPD3DXBUFFER * ppEffectInstances, //效果实例接口

    DWORD * pMatOut, //材质数

    LPD3DXSKININFO * ppSkinInfo, //蒙皮信息接口

    LPD3DXMESH * ppMesh //加载的网格模型接口

    );

    需要特别注意是LPD3DXSKININFO * ppSkinInfo接口,储存着蒙皮信息。

    当你加载一个网格,并读取了的这些顶点的权值之后,你可以变换这些顶点去匹配骨骼的方向,使用以下步骤:

    1)迭代所有的顶点。为每个顶点进行第2步。

    2)对当前顶点连接到的每一个骨头,得到骨头的变换矩阵。

    3)对于每个骨头的变换矩阵,用顶点的权值乘以这个变换矩阵然后把这个结果应用到顶点的组合变换矩阵。

    4)为每个连接的骨头重复第三步,然后为每个顶点通过第四步重复第二步。当你完成以上步骤,把组合变换矩阵应用到具体的被迭代的顶点(从第一步)。

    怎样精确的获得顶点的权值?可以利用ID3DXSkinInfo接口的GetBoneVertexInfluence方法得到这些权值。顶点的权值一般储存在Mesh数据对象的末端。执行完以上步骤后,剩下的仅仅是渲染了。结合前面介绍的计时动画技术,可以把关键帧时间和变换矩阵储存在AnimationSet模版中,利用一些变量不断的修改和更新骨骼层级便能创造出各种动画效果。





    3 增加场景数据

    在游戏中,仅仅有活灵活现的角色动画是远远不够的。因为你需要让它在具体的场景中尽情地表演,这就需要场景数据。场景数据中最具代表性的就是角色模型在游戏世界中的位置,包围球半径。显然,还有很多其它数据,这些数据都是因场合而异的。正如前面所说,X文件可以用于储存任何数据,包括场景数据。但是用X文件储存场景信息会碰到很多麻烦。比如你很难找到能够把模型转化成附有场景信息的X文件的建模工具。当然,你可以自己开发建模工具的插件。下面我介绍一个简单有效的方式得到场景数据。

    很多建模软件都支持导出XML文件。在3DSMAX中,就有这样的插件。完全可以在XML文件中储存场景信息。这样,就需要一个XML文件的读取函数。虽然XML文件较为复杂,但是利用一些帮助库,可以很方便的写出XML文件的读取函数。Tinyxml 就是一个小巧稳定的XML帮助库,在互联网上可以找到很多关于它的信息。我们的目的就是把XML文件中的场景数据根据需要加载到自己定义的数据结构中。

    假设定义这样一个简单的数据结构:



    struct SMeshSceneInfo //Mesh场景信息,为了访问的便利,不使用链表动态分配内存



    {



    SMeshSceneInfo()



    {



    int ID=0;



    D3DXVECTOR3 position(0.0f,0.0f,0.0f);



    }







    string name; //Mesh的名字



    int ID; //MeshID



    D3DXVECTOR3 position; //Mesh世界坐标





    };

    接着利用帮助库的函数,在程序的初始化阶段加载场景数据到这个数据结构中。之后在程序里就可以利用这些数据进行相关的操作。









    4 简介渐变动画

    回到20世纪90年代早期,一种革命性的计算机图形动画技术称之为morphing,就是渐变。它一举成功,成为主流技术,并延用至今。游戏中的渐变技术,最好的例子可能就是ID SOFT的雷神之锤(Quake)。所有这些角色的动画序列由一系列的渐变网格模型构成,一个模型缓慢的改变形状变成第2个模型,第2个模型再改变形状匹配到第3个网络模型上,以此类推。

    其实渐变动画的原理很简单,就是差值两个关键帧模型的顶点。第一个关键帧模型叫做源网格模型,第二个关键帧叫做目标网格模型。当从第二个关键帧向第三个关键帧变化时,第二个关键帧网格又变成源网格模型,第三个关键帧变成目标网格模型。

    下图显示了随着时间的变化,各网格顶点的变化:



    每个顶点都共享源网格模型和目标网格模型中相同的引索。在这里,顶点的次序尤为重要,如果次序错误,将产生奇怪的动画效果。

    相比骨骼蒙皮动画,渐变动画的逻辑简单许多,如果掌握了前者,很容易就能实现各种基于渐变动画的效果。





    四 结束语

    游戏的世界正因为各种动画技术的灵活运用才显得绚丽多彩,有趣迷人。在不久的未来,更棒的动画技术将会普及。比如,在游戏中你是一个身怀绝技的武士,当对手跃起,咆哮着从上方挥刀砍来,你不能简单地按游戏手柄的“挡格”键,而是真正的手握战刀,看准时机把对方的攻击化险为夷。各个动作的计算准确无误,如果你愿意的话,可以如实记录你的行为,立即产生出相同的动画效果。或者你是一个高尔夫球的爱好者,并不是任何地方都有打高尔夫球的场地。没有问题,你同样可以在家里尽情地挥棒击球,享受高夫球的乐趣。相信你可以想象出更多有趣的事情。这不仅仅是想象,而是不久就能体会到的快乐。





















    相关参考资料:Introduction to 3D Game Programming with DirectX 9.0 by Frank Luna

    ISBN:1-55622-913-5 Wordware Publishing © 2003 (388 pages)



    Advanced Animation with DirectX by Jim Adams

    Copyright © 2003 Premier Press, a division of Course Technology.



    Advanced 3D Game Programming with DirectX 9.0 by Peter Walsh

    ISBN:1-55622-968-2 (pbk.) Copyright © 2003 Wordware Publishing, Inc.



    DirectX 9.0 Programmer's Reference by Microsoft

    2005 Microsoft Corporation. All rights reserved.



    硬件支持下骨骼蒙皮动画的实现 by Octane3d
  6. May28
    http://www.marxists.org/subject/art/music/mp3/hasta_siempre.mp3

    Hasta siempre Comandante

    Aprendimos a quererte
    我们学会如何爱你
    Desde la histórica altura
    从历史的顶点
    Donde el sol de tu bravura
    在那里你勇气的光辉
    Le puso cerco a la muerte
    包围了死亡
    Aquí se queda la clara
    La entraniable transparencia
    De tu querida presencia
    画像中,你深邃的目光变得如此清晰
    Comandante Che Guevara
    我们的英雄------切.格瓦拉
    Tu mano gloriosa y fuerte
    你光荣而强壮的手
    Sobre la historia dispara
    燃烧着历史
    Cuando todo Santa Clara
    当圣克拉拉
    Se despierta para verte
    从梦中醒来看见你

    Vienes quemando la brisa
    你燃烧着风
    Con soles de primavera
    用春天的阳光
    Para plantar la bandera
    Con la luz de tu sonrisa
    用你的微笑的光,插上光荣的旗帜
    Tu amor revolucionario
    你的革命的情怀
    Te conduce a nueva empresa
    引导你到下一个新的事业
    Donde esperan la firmeza
    De tu brazo libertario
    人们期待着在你自由而坚韧的臂膀中

    Seguiremos adelante
    继续向前
    Como junto a tí seguimos
    沿着那段我们一起走过的路
    Y con Fidel te decimos
    今天,我们对你倾诉:
    Hasta Siempre, Comandante
    我们的英雄格瓦拉永垂不朽



    “At the risk of seeming ridiculous, let me say that the true revolutionary is guided by a great feeling of love.”
    —Che Guevara

    “让我冒着被人嘲笑的危险说出来吧,引导真正的革命者前进的,是伟大的爱。”——切.格瓦拉

    拉美人民纪念切的歌曲《我们的朋友,我们的指挥员-切.格瓦拉》
    http://reisepirat.com/Musik/Buena Vista..e Guevara.mp3

    在路上 ------ 纪念伟大的切·格瓦拉

    一九五三年,一个二十五岁的年轻医生和他的朋友卡利萨·费雷尔骑着摩托车开始了贯穿整个南美洲的旅行,这是一次充满热情的两个年轻人的旅行。也许那个二十五岁的年轻医生自己都没有想到这次旅行会改变他的一生。也许,如果没有这次旅行,他会成为一名很普通的阿根廷医生,和所有医生没有任何区别。


    ------那真是一次激动人心的旅行,他们在暴雨中穿越亚马逊河,于阳光下在广袤的巴西平原上奔驰,穿行于茂密的亚马逊雨林中,在雄伟的安第斯山下宿营。旅途中,他们曾经做过服务员,摄影师,甚至半年歌手,他们快乐地前行。享受着流浪的乐趣。正如他日记中所说“我们还不知道此行的目的和方向”。

    ------可旅途中并不全是快乐,因为他们遇见了很多人,形形色色的人,穷人,富人,乞丐,占领者,他们甚至去一个小岛看望过被隔离的麻风病人。离开时,渐行渐远的船上,麻风病人们感激的眼神给了他震撼,他意识到原来给予他人关怀是如此重要。更让他震撼的是在他脚下这片广袤的土地上,还有很多人不能充分享受这土地给他们带来的快乐与自由。


    ------一九五五年,他遇见了一个人,那是一个留着大胡子,“知识渊博、年轻有为、充满自信”的人他叫“菲德尔·卡斯特罗”。这是一次伟大的足以载入史册的邂逅。这次邂逅,让他结束了这次三年之久的穿越整个南美洲大陆的旅程。但这并不代表他已经到达了目的地。


    -----一段旅程的结束,代表了了另一段旅程的开始,在接下去的另一段旅程里,他的名字开始为世界熟知。很多人都知道了这个勇敢,浪漫而充满激情的年轻革命者----切·格瓦拉!


    -----他与卡斯特罗穿行于古巴的丛林之中,为穷人治病,为伤员疗伤,闲暇时他会摆弄心爱的照相机,大声地在战斗的间隙为大家朗诵自己创作的诗歌,危险来临时也会拿起枪去战斗,战斗过后,他又会放下枪,抱起吉他,深情的一展歌喉。


    -----多么奇妙而又刺激的生活啊!虽然危险,但在他看来却是如此的充满了快乐。因为那是真正属于他的生活。

    -----一九五九年,三十一岁的切·格瓦拉和卡斯特罗为古巴人带来了自由!


    -----三十一岁这年,他终于成为了很多人的最衷心爱戴的人。古巴人民给了他在他看来最至高无上的荣誉,宣布他为古巴公民!此时,所有人都认为他应该歇歇了,理所应当地享受作为一个胜利者应该得到的荣誉与安逸的生活。


    -----于是切·格瓦拉知道,这段旅程又该结束了!



    -----他平静地做了一个在他看来再普通不过的决定,那就是放弃一切。重新踏上另一段旅程!一九六五年四月一日,他给卡斯特罗写了告别信,辞去党内外的一切职务、军籍和军衔。为了避免连累古巴,他还宣布放弃古巴国籍。信中,他说到“他对单一的苏联模式感到不解和失望,对社会主义的前途感到忧虑,因为他发现不少的革命者都是在豪华的汽车里、在漂亮的女秘书的怀抱里丧失了往日的锐气。所以,为保持革命者的完美形象,他只能选择战斗,选择一个凤凰涅盘式的壮美结局”!



    -----一九六五年年六月,他回到了南美大陆,成立了自己的游击队,重新开始了游击生涯。

    -----没有人能够理解。只有他自己知道,那个美丽的加勒比岛国并不能成为他旅途的终点。他血液中始终奔流不息的是对自由,理想,冒险的渴望与探寻。他已经无法抑制自己的脚步。


    -----他当然意识到放弃安逸的停歇机会与重新踏上充满危险的旅途有可能会付出的代价。所以在一六七年十月八日,他在战斗中负伤被捕时,他很平静地说“我是切·格瓦拉!”


    -----被捕后的切·格瓦拉有一张鲜为人知的照片,长期的艰苦游击生活,使三十九岁的切·格瓦拉显得苍老而沧桑,但被凌乱的头发与浓密的胡须布满的脸上,坚毅的眼神中流露的那份出奇的平静让人惊讶。他平静地拒不回答任何问题,审讯一无所获。最后,审讯者问:“你现在在想什么?” 格瓦拉坚定地回答:“我在想,革命是永垂不朽的。”


    -----次日,切·格瓦拉即被处决。


    -----一九六七年十月九日切·格瓦拉在刑场上留下生命中最后一句话,他平静地对刽子手说:“开枪吧,你要打死的是一个真正的男子汉。”

    -----那一年,切·格瓦拉三十九岁,三十九岁的切·格瓦拉终于在旅途中止步了!

    ----这充满悲剧色彩的第三段旅程为他的整个旅程添上了一丝悲壮。但,正是这第三段旅程成就了切·格瓦拉的传奇。已经在第二段旅程中成为英雄的切·格瓦拉正是在这段旅程中上升为一个偶像!一个精神图腾!


    -----也正是这段旅程,使他没有成为斯大林,毛泽东那样的铁腕领袖。我们也完全可以平静地审视他,而不用象对毛泽东,斯大林那样,崇敬的目光中带着更多的敬畏。他更象是一个充满热情的孩子,一个浪漫主义诗人,一个身怀浪漫色彩的真正革命者。他将原本充满暴力的革命诗化了,但蕴含的激情依旧!不能因此怀疑他的立场,他是真正博爱的,这种博爱不分国家,种族,地域,宗教,当这个阿根廷人为古巴人获得自由,最后又为玻利维亚人的自由而客死异乡时,所有人都相信这一点。


    ----我们可以理解他身上表现出的那些特质正是他人格魅力的所在,三十四年后,所有的人,包括他的敌人都对他表示着深深的敬意。这一点,毛泽东,斯大林同样没有完全做到。他的头像被印上了三亿件T恤,世界各个角落不同国家,不同民族,不同信仰,不同职业的一代又一代的人都希望从他的旅途中找到生命的意义。追随他的脚步踏上属于自己的旅途!

    -----这才是切·格瓦拉作为一个人之于我们的意义,他只是告诉了我们生命的意义就是“在路上”!生命之旅,漫长而短暂,我们所要去做的只是不要停下来!


    -----生命不止,奋斗不息!


    -----仅此而已!


    仅以此文献给伟大的切·格瓦拉---一位诗人,一位革命者,一位“旅人”!
  7. May28
    磔刑图,出于阿尔萨斯伊森海姆(Isenheim)祭坛画M. 格吕内瓦尔德[德] Matthias Grünewald(1470/75-1528)法国,科尔马,林登美术馆藏,1512~1515



    埋葬基督,M. M. d.卡拉瓦乔[意] Michelangelo Merisi de Caravaggio(1571-1610)罗马,梵蒂冈美术馆藏,1602-1604

    在客西马尼祷告(太26:36-46)
    (可14:32-42;路22:39-46)


    耶稣同门徒来到一个地方,名叫客西马尼,就对他们说:“你们坐在这里,等我到那边去祷告。”于是带着彼得和西庇太的两个儿子同去,就忧愁起来,极其难过,便对他们说:“我心里甚是忧伤,几乎要死,你们在这里等候,和我一同警醒。”他就稍往前走,俯伏在地祷告说:“我父啊,倘若可行,求你叫这杯离开我;然而,不要照我的意思,只要照你的意思。”来到门徒那里,见他们睡着了,就对彼得说:“怎么样?你们不能同我警醒片时吗?总要警醒祷告,免得入了迷惑,你们心灵固然愿意,肉体却软弱了。”第二次又去祷告说:“我父啊,这杯若不能离开我,必要我喝,就愿你的旨意成全。”又来见他们睡着了,因为他们的眼睛困倦。耶稣又离开他们去了。第三次祷告,说的话还是与先前一样。于是来到门徒那里,对他们说:“现在你们仍然睡觉安歇吧(“吧”或作“吗”)?时候到了,人子被卖在罪人手里了。起来,我们走吧!看哪,卖我的人近了。”
    耶稣被钉十字架(太27:32-44)
    (可15:21-32;路23:26-43;约19:17-27)


    他们出来的时候,遇见一个古利奈人,名叫西门,就勉强他同去,好背着耶稣的十字架。到了一个地方名叫各各他,意思就是髑髅地。兵丁拿苦胆调和的酒,给耶稣喝。他尝了,就不肯喝。他们既将他钉在十字架上,就拈阄分他的衣服。又坐在那里看守他。在他头以上,安一个牌子,写着他的罪状,说:“这是犹太人的王耶稣。”当时,有两个强盗,和他同钉十字架,一个在右边,一个在左边。从那里经过的人,讥诮他,摇着头,说:“你这拆毁圣殿,三日又建造起来的,可以救自己吧!你如果是神的儿子,就从十字架上下来吧!”祭司长和文士并长老也是这样戏弄他,说:“他救了别人,不能救自己。他是以色列的王,现在可以从十字架上下来,我们就信他。他倚靠神,神若喜悦他,现在可以救他,因为他曾说:‘我是神的儿子。’”那和他同钉的强盗,也是这样地讥诮他。
    耶稣的死(太27:45-56)
    (可15:33-41;路23:44-49;约19:28-30)


    从午正到申初,遍地都黑暗了。约在申初,耶稣大声喊着说:“以利,以利!拉马撒巴各大尼?”就是说:“我的神,我的神!为什么离弃我?”站在那里的人,有的听见就说:“这个人呼叫以利亚呢!”内中有一个人赶紧跑去,拿海绒蘸满了醋绑在苇子上,送给他喝。其余的人说:“且等着,看以利亚来救他不来。”耶稣又大声喊叫,气就断了。忽然殿里的幔子从上到下裂为两半,地也震动,盘石也崩裂,坟墓也开了,已睡圣徒的身体,多有起来的。到耶稣复活以后,他们从坟墓里出来,进了圣城,向许多人显现。百夫长和一同看守耶稣的人看见地震并所经历的事,就极其害怕,说:“这真是神的儿子了!”有好些妇女在那里,远远地观看,她们是从加利利跟随耶稣来服侍他的。内中有抹大拉的马利亚,又有雅各和约西的母亲马利亚,并有西庇太两个儿子的母亲。
  8. May28
    从申请这个博客到写第2篇文字竟然间隔了1年!
    主要是开始博客没汉化完全,还有就是没时间.
    现在有点空了, 所以准备搞一搞
    顺便研究一下这个博客. :woot:
  9. May28
    夜幕下的慕尼真黑



    韩乔生

    《欢乐世界杯》的第一期直播让我热血沸腾,王刚老师的妙语连珠、见解独到,王小骞的聪明机智、应对自如,嘉宾的精彩让幕后的同事笑得前仰后合,“二王落网”对于《欢乐世界杯》来说,就像本届世界杯的第一粒进球,让我们领略到了欢乐的激扬和鼓荡。
    韩乔生语录6月9日
    世界杯还没开幕,王刚老师一起陪您过夜。对不起我说错了,应该说王刚老师陪我和我们过夜。
    坐在王刚老师旁边的这位美女,是王小丫——错了是王小骞,小骞姐姐,哦……是小骞妹妹。
    全世界的正业——最正点的业务就是看球。
    出泥才见两只腿。
    格里奥这发型像谁啊?就是王小骞摸了电门之后的样子,因此被称之为铅丝(王小骞的粉丝)。
    我们经常看王刚演的电视剧、广播剧,此前是夜幕下的哈尔滨,如今是夜幕下的慕尼黑。(当时场地天光明亮)
    我一看这个画面心都跳出来了,把心捡起来,再接着说,把心洗洗,保持洁净心灵。
    种种迹象表明,足球比赛开始之前,裁判和观众都在等着。
    大家看这个特里尼达和多巴哥,这是本届世界杯最黑的斑马,两个队合在一块打一个队。(最黑的斑马?)
    我强调足球和男人的关系,埃塞俄比亚缺男的乒乓球教练,我可以考虑到那去,必须那边月供要达到40万人民币。(王小骞:月供?你是房子啊?那是月薪)。
    你坐飞机去英国的时候,飞机降落之言,您会看到绿色草坪足球场很多很多,一共一万一千一百一十一块。(不信你去数数。)
    我原来一直喜欢孙雯,我暗恋孙雯很多点,我暗恋她接近三十年。(王刚:你也太早恋了。)
    台风中心经过墨西哥后跨越大西洋,迅速挺进慕尼黑上演一场风暴,五到六级台风中还有井喷现象,现在这种地震特殊征兆已经形成。(世界杯灾害陈列)
    :devil:
  10. May28
    TOM军参近期很热的帖子,内容是否真实全看自己的理解,实在不行就当是军旅小说好了...



    月底了,秋风已经吹起,这是个好时光,丛林里有很多果子都熟了,每次巡山都能吃饱,其他班的战友经常出任务,我们暂时还没有,有一天,山猪小队回来了,神情不好,之后我们知道了怎么回事,有个战友没回来,袭击完毕后,殿后突击组的蝰蛇牺牲了,据说黑夜里蝰蛇掩护大部队撤退的时候,看到个孩子,只穿了大短裤,他挥挥手让孩子走开,转身的时候,这个孩子不知道从那里抽出手枪击中了蝰蛇,尸体没能带回来,山猪小队要躲避敌人的追击,不能带着尸体,蝰蛇就这样永远的长眠在缅甸的丛林里。

    我们的部队跟普通的部队不一样,普通部队跟我们相比,简直是天堂,武警部队就是天堂中的天堂了,我们驻扎在大山里,与世隔绝,离最近的小镇还有4个多小时的山路,每天看到的都是大山,营房,战友,大山,营房战友,没有批准,是不能离队的,每天除了训练还是训练,每天的娱乐就是7点的新闻联播和唱歌,没事情的时候,没人会想起我们.祖国对我们来说,是指导员和电视里看的,我们是隔绝在罐头里的,这样最好,不会变质,不会不忠于祖国!

    感谢大家给我的鼓励,我一直有个想法,就是将我的故事写出来,但是我的文采不行,所以一直没有实施,我想在这里,借红豆的一席宝地,慢慢的将我已经尘封的故事写出来

    新兵生活对于很多当过兵的人来说,没什么好说的了,我想,从我进入侦察连训练开始说吧

    97年,香港回归那段时间,部队要从两年兵里挑选侦察兵,每个人都可以报名,通过连队的准许和初步考察后,我顺利的进入了复试,我有一技之长,就是射击,从小在部队长大,从我的爷爷的爷爷开始,我们家就有从军的传统,我是拌着枪长大的,可以毫不夸张的说,部队当时所有的现役枪支我都可以随便拿起就打个10环.
    我们被拉到了一个训练营里,我们很兴奋,似乎我们已经是人人景仰,人人胆寒的特种士兵,带队连长给我们介绍了基本情况和注意事项后,教官出现了,这是个个子不高,看起来也不怎么强壮的人,跟我们想象中的特种部队队员简直大相径庭,不过想想,我也不是那么的看起来很顺眼,也是个子不高,身材不怎么壮实的那类. 教官开始什么都没说,只是在我们面前走来走去,他的眼睛很威严,是那种让人永远也猜不透他在想什么的人,之后,他回头对带队连长说了句话:你们选了那么久,就选了这么些垃圾给我!!什么??我们是垃圾??!!我们可是整个部队里最好的士兵. 他终于回过头对我们说了第一句话:在这里,我就是皇帝,你们在这里没有名字,只有编号,直到你们被踢回去或者从这里走出去,你们的命是我的,我不管你们在部队里多么威风,在这里,回答我的话只有两句:一是:是!教官!!二是:明白!教官!!如果让我听到第三句,我就会让你们-他- 妈-的-屁股开花!!听明白了吗!!!说得那么清楚,能不明白吗,我隐约感到,我的好日子到头了~ 接下来,是领训练服和些生活用品,还领到了我们各自的编号,我领到了4318,看着怪不舒服的,不过318是我的生日,或许他会给我带来好运!

    之后,分配房间,吃饭,无所事事,没人搭理我们,这里的人都是冷若冰霜,熄灯号响了,睡觉 大约凌晨3点,正是美梦时间,一阵急促的哨声想起,紧急集合!我们一阵忙乱,冲出门口,还没回过神了,一条高压水柱劈头淋了过来,我们东倒西歪的终于排好队,教官说,确切点应该是吼!你们这帮他~妈的臭虫,三岁小孩都比你们跑得快,没事了,滚回去睡吧!! 这晚,我们被教官整了3次,筋疲力尽~

    5点,起床,教官吹哨集合,二话不说,先跑15公里武装越野,我们上气不接下气的跑完回来,等着吃早饭,又一阵哨子,我们再次集合,这次不多,5公里而已,先跑回来先吃饭,妈呀~~~晚了就难说了 很不幸,我没赶上早饭时间,饿着肚子跑了一天,教官好象对次乐此不疲,想想就5公里,15公里,10公里,要不,围着操场跑,直到他说停,而且,还很喜欢让你拿着些很不舒服的东西,比如,没有枪带的枪,断了个背带的背包,让我们怎么拿都不舒服的东西来跑,还有,边跑边大声的唱歌,经常把我们弄得快断气,规定时间跑不到,继续,直到你跑到为止,就这样跑啊,爬啊,跳啊,半夜还有不知道什么时候的紧急集合,有时候几天不让你睡觉,在我们看来,教官简直就是魔鬼撒旦,不~~他比撒旦还撒旦.

    3个月后,一些人被淘汰了,我险些在这些人里面,不过还好,我有个好处,就是做事就做最好,就算有最后一丝力气,我爬都要爬到终点. 接下来是专业训练和小组训练,我们被分成不同的小组,突击组,渗透组,狙击组,机枪组,分别进行不同的训练和磨合训练,我进了狙击组,专门训练狙击战术和情报判读等等~专业训练对体能训练来说,舒服了很多,基本弹道学,枪支熟悉,狙击工具,狙击训练,情报判读,路径选择,阵位选择,特种车辆驾驶,长途拉练,单兵拉练,时间一天天过去,我也慢慢成长成个几乎合格的特种士兵

    最后的考试到了,这是实战拉练,也是决定我们是被送回普通部队还是成为个真正的特战队员,过了这一关,我们就不在是学员,而是在编的特种士兵,我也不再听那刺耳的4318,而会有个好听的代号

    凌晨1点,集合,教官给我们发了一张地图,一支枪,一发子弹,一把野战匕首,2两米,2钱盐,指北针,水壶,狙击手的画图笔,背囊除了模拟负重,什么都没有,而且,背囊回来要过秤,少一两都不行,直升机把我们扔到了大山里,我们从来没来过的世界.

    我们小队5个人,开始了分工,我在地图上标示出目的地,现在位置,中途有可能得到补给的地点,前进的分目标,前进的线路等等,他们开始制作野外生存工具,现在,我们暂时还是安全的,2个小时后,我们有了2把弓,十几支箭,几根梭镖几把石刀,到达地图标示的第一个集合地点后,我们发现了个重大问题,地图和地形不匹配,也就是说,地图是假的,没办法,我只好重新修正地图,这要耗费很多时间,因为,每到一个集结地我都要修正地图,MD~~我心里恶狠狠问候了教官他全家女性,都这时候了,还给我们下扳子!

    前三天很顺利,每天推进10几公里,没有人打搅我们,除了该死的蚊子,沿途伙食不错,晚上用头盔抓地老鼠,一路上还顺手抓了两条蛇,下鸟套还套了只不知名的鸟,每天睡上4个小时,照这样的速度,我们用不着20天就可以跑完150公里,顺利过关了.

    第四天,行军涂中,前锋侦察发现了个脚印,这不是我们的脚印,花纹不对,这是野战特种部队的野战靴的印子,昨天傍晚下过雨,脚印有些模糊,曾经被水泡过,也就是说,这个脚印是前两天留下的,从脚印的摩擦来看,是轻步兵,要么是大队侦察兵,要么就是渗透部队,我们搜索了附近,没有发现大队的痕迹,难道是掉队的士兵??不可能,对于老特战队员来说,这是个低级错误,脚印是向山下方向的,山下有个峡谷,是原来我选择的行进路线,看来,我们不能走这个方向了,两天,对于特战队员来说,并不是个长的时间,他们有足够的耐心等我们从他们眼皮子下面经过,然后干掉我们,丛林是他们最好的隐蔽,而我们根本不知道他们会在哪里等我们.经过商量,我们决定改变行军线路,翻过大山,然后折返,从小河泅渡,然后在转过封锁,这样虽然线路长了很多,但是比较安全,看来,今夜不能睡觉了!

    很幸运,我们成功的躲过了第一轮伏击,但是付出的代价是,今天我们只行进了8公里,如果这样下去,我们无法在规定的时间内到达目的地,当然,最近的距离在物理上永远是直线,在军事上,直线是最远的,白天,直升机不时的从我们头上飞过,那是等信号弹的,如果有人坚持不住,只要一拉信号弹,他就可以退出,我可不希望我被直升机吊走,训练那么久功亏一篑,岂不是太冤枉了!

    接连几天,我们都在老特种队员的追赶堵截下疲于奔命,我们开始怀念前几天的老鼠和蛇了,应该留点,现在别说打猎,连水源边都有老东西们设下的陷阱和拌雷,连水都快喝不上了,只能向丛林索取,晚上也不敢生火,我们象受惊的兔子,每时每刻精神都高度紧张,行进线路一改再改,改的我恨不得长翅膀飞过去,似乎我们想什么这些老东西都知道,每条线路都有他们的人在等我们,这几天我们几乎没有挪窝,就在兜圈,看来,我们被包围了,而且还跑进了他们的中间!完了,我的特战梦快破灭了,都怪我,是我把我的小队带进了这个鬼地方,如果我另选条路,哪怕远点都比在这里强!

    第十天,天助我也,下了大雨,我们在雨幕中突破了包围,我们已经浪费了很多天时间了,现在我们哪怕跑看来也赶不上了,怎么办??我忽然想起,目的地旁边不是有条大河吗?我学过,如果不会走就跟着小溪走,小溪会变小河,而小河会汇入大河,这里还很危险,不能造船,于是我们就叼着空心草,找了几个枯死的树桩,就这么抱着树桩顺着涨水的小河漂流,速度真快啊,转眼就跑出30公里了,终于跑出了危险地带,我们立即找来树枝等等,做了个木筏,快马加鞭的赶出去~~

    命运之神终于眷顾我了,我们在第18天最早到达了目的地,我们合格了!!!我们成为了特战士兵了!!!兴奋的感觉将所有疲惫一扫而光!!

    训练结束了,我们呆了快一年的训练营要送我们走了,我很自豪,我是走出来的,而不是被踢出来的,同来的300多人,只留下了80多个,我们用努力证明了我们是最优秀的,之后,我们将被分配到侦察连里,我从个普通士兵变成了丛林特种侦察连的狙击手,代号猎鹰!!

    训练营给我们开了欢送会,原来铁板脸的教官终于露出了笑容,我忽然觉得他也不是那么可恨,如果不是他,我们就不能成为合格的特战队员,我要感谢他,但我知道,我永远不能在回到这个地方,这是部队的规定,除非,我是以教官的身份回来,教官他训兵10年了,妻子没能随军,并不是部队不允许,而是训练营的生活太苦,在这个与世隔绝的地方,活下来是需要勇气的事情!

    我又重新成为了新兵,一个丛林特种侦察连的新兵,本来以为我很快可以出任务了,可以展现自己的神枪狙击的风采了,可是,依然是常规训练,我在训练营里的小组被编成了个班,我们每天的训练就是磨合大家,偶尔还有跟其他小队的进行对抗性训练.就这样又过了两个多月,终于可以出任务了

    任务很简单,抓个人,他在边境的一个小村里,据说是走私枪支弹药的,我的任务就更简单了,找个位置作为观察手,随时报告情况,旁边还有个老狙击带着我,任务很顺利,渗透小组轻而一举的就渗透进去了,剩下的就是怎么安全的把人带出来,这家伙身上绑着手雷,就象我们所说的光荣弹,他死了不要紧,我们的命可比他的贵,渗透小组带着微声冲锋枪,贴着脚楼慢慢的接近了"目标"我在瞄准镜里看着渗透小组的一举一动,感觉有喉咙发干,第一次执行任务,我有点紧张,我知道,渗透小组只要有点差错,狙击手要以最快的速度干掉目标,我的战友的性命或多或少的掌握在我手里,老狙击看出我的紧张,他跟我说了一句:别紧张!跟我换个位置,于是,我从主射手变成了副射手

    任务完成的很完美,没有惊动任何人,那家伙被摁在床上,根本来不及光荣就被我们逮住了.之后移交给上级,第一次任务给我的感觉是:虽然有点紧张,但是好象不过瘾!跟我想象的不太一样,不过渗透小组可不是这么看的,他们说,NND~~爬得一身的鸡粪,这家伙力气真-他-娘-的-大!差点没把我们也光荣了!!


    随后,我又出过几次任务,都是些小任务,这些任务我没有开过一枪,似乎就是个看客一样看着战友渗透,抓人,带走,剩下的时间就是训练,有时候巡逻边境,日子很无聊,也很充实!

    人质事件

    这样过了好几个月,我们小队也已经磨合得很不错了,边境巡逻也了解了不少情况,这里的人都比较穷,走私从来都没有断绝过,和缅甸接壤的地方,有很多小路可以互通,隔着条河就是两个不同的国家,巡逻中经常可以看到有人背着走私品越境,我们这边的药品,很普通的清凉油到了那边就是天价,还有些走私兽皮的,等等.

    一般这些人我们都不抓,一是没那么多精力来管,二是这些人都很狡猾,会算准我们巡逻的时间,打时间差,就算被抓住了,把东西往草堆里一扔,死不承认是他的,如果不是走私兽皮,枪支,毒品的话,我们一般都只是盘问搜查一下就放人,而大单的走私比如枪支毒品等,他们会有一整套的计划,轻易是抓不到的.我们和边防的呆久了,慢慢也有了经验,什么人该抓,什么人该搜,甚至,有些走私专业户都认识我们了,看到我们巡逻也不躲,还拿出东西来给我们吃,边防的战友说:这里都穷,走私点山货赚点盐巴钱,你忍心抓他们么?

    大概是1998年12月左右,一架"河马"直升机来到了我们驻地的训练场,匆匆下来几个人,直接就奔连长去了,没多久,我们小队和另外一支小队奉命出发,开始我们以为是出境任务,(一般来说,直升机来接人基本都是出境任务)不过方向好象不对,不是往南飞的.

    半小时后,直升机降落在一个小学的操场,这里已经被警察,武警包围了,我们下了飞机,在一个教室集合,一个武警的上尉给我们做简报,大意是:XX镇发生了武装劫持人质,被劫持的是一家人,歹徒有3个,有两支手枪和一支AK47,上午武警和警察进行了一次解救,但是没成功,男主人被杀害,因此,向军区求援,把我们派来.接下来,介绍了地形情况,人质和劫匪在一个3层的小楼里,这样的楼在这里来说是很少见的,情况介绍后,警察给我们拿来了黑色的作战服,要我们换上,我们问:为什么,一个警察尴尬的笑笑说,你们穿着丛林特战袖标的衣服,影响不好,影响不好.我们换上了衣服,带上头套和头盔,强攻组和渗透组穿上了防弹衣,换乘了一辆客车来到了案发地

    人山人海,给我们的第一感觉是这样,我们的车费了好大劲才靠近,这里民风彪撼,路过的时候断断续续的听清了大概,原来,三层楼的主人和劫匪原来认识,并且有金钱来往,劫匪还借给过他钱,结果,他没还也就罢了,还用这钱起了栋3层的小洋楼,于是这人气不过,就绑了他要钱,多少钱我就不清楚了,不过我想:能搞那么大单的事情的,应该不是小钱,双方的亲友都来了,吵吵嚷嚷,想自己解决,警察和武警都快控制不住场面了,更多的是些不知情的村民,远远伸长脖子看.

    镇上居民已经撤离了,武警和当地的警察在喊话,楼下躺着一个人,估计是男主人,我们检查了装备,检查了通话系统,各自散开寻找阵位,我找了一个距离小楼90多米的一个角楼,视野良好,可以看完整个楼的正面窗户和门口,武警和警察还在喊话,我趁这个机会校正准星,85式狙击枪的默认表尺是600米,在这个距离上根本打不到目标,我将表尺校正好,用对讲机通知了队长:猎鹰一号已经就位,没多久,猎鹰二号,胡狼一号(渗透组)和老虎(强攻组)一号也报告就位,外围控制的蓝狐和火狐也就位,眼看着就要发起攻击了

    情况有变,警察找来了劫匪的妻子孩子,正在进行亲情攻势,行动暂时取消,各组退回了原来的阵位,一直到傍晚,我们都在等命令,他的妻子孩子泪涕俱下,一直到了晚上10点都没有效果,领导们商量过后,决定在明天白天实行解救计划,我们就猫在各自的阵位等待黎明的到来.我一直认为晚上是个好机会,不过我们的装备~~~~不合适夜战解救!

    趁着待命的时候,我用小锉刀挫了几颗子弹,这个距离上,要求的是精度,不能有任何一点差错,虽然,我的子弹都是一发一发挑出来的,但是,自己改过更好些,天亮了,行动开始,我在瞄准镜里监视着楼内的一举一动,并及时报告,渗透小组用抛绳弩顺利的控制了楼顶,并将楼顶顶盖打开,强攻组也渗透到了楼下,3楼有一个劫匪,看着孩子,两个在2楼,焦躁不安的走来走去,还不时的互相大喊大叫,我心里暗暗好笑,看来是恐怖份子初级阶段,连窗帘都不放下来,一切情况我一目了然,渗透组悄悄的进了3楼,微声冲锋枪结果了一个,并且将孩子带上了楼顶,只剩下女主人还在劫匪控制中,强攻组也渗透进了楼房,楼房外,一个高音喇叭在播放着噪音,劫匪似乎觉察了点什么,向外面开枪.

    命令来了:猎鹰一号,你能看到什么,回答!我看到两个劫匪,一个在东面墙角床边,无法有效命中,一个在窗口,人质躺在床上,完毕!窗边是否能有效命中,回答!命中概率95,完毕!老虎一号,准备强攻,猎鹰一号,击毙窗边的后,老虎进攻!明白吗,回答!猎鹰一号明白,老虎一号明白,完毕!就在我准备开枪的时候,东面墙角的人忽然跳起来,将女主人拉起来,用枪在她头上指来指去,对着另一个大喊大叫,情绪似乎失控,我将这个情况报告,上司命令:立即行动,我慢慢吸了口气,将准星牢牢的套在了窗边人的头上,85一声闷响,目标头上绽出团红白相间的东西,"猎鹰一号,目标终结"我报告了情况,老虎几乎是在我枪响后就立即冲了进去,但是人质挡住了射击路线,无法开枪,劫匪情绪已经完全失控,冲着我的队友大喊,并不断的用人质遮挡自己,老虎无法射击,情况危急,我不断的在对讲机里报告情况,似乎老虎现在无法下手.

    指挥所也弥漫着紧张的气氛,没多久,命令来了,无论如何,击毙罪犯,决不与其妥协!我指挥老虎将目标慢慢逼近到窗口边,目标已经歇斯底里,老虎们也向他吼着,慢慢的把他从墙角逼出来,目标头部已经暴露在我的瞄准镜里,但他不断的晃动,我很难瞄准,我向指挥所报告:命中概率80,但有可能伤及人质,我有把握一枪击毙,但是,如果不命中头部的神经中枢,他不会立即死亡,手指的痉挛很可能扣动扳机,将人质或者我的队友打中,而神经中枢只有6厘米见方大小,我要么命中其眉心,要么打他的太阳穴,目标并不很大,老虎开始慢慢向门口退,以安抚他,让他安静下来,目标情绪开始缓解,也不晃来晃去了,机会难得,我趁他将侧面对着我的一瞬间,扣动扳机,又一声闷响,"猎鹰一号,目标终结"我冷冷的报告完情况,长长的舒了口气~


    我被狙击了
    第一次杀人,感觉似乎并没有什么,他是匪,我是兵,兵杀匪天经地义.何况,他是个该死的匪,狙击的训练也帮我大忙,狙击手永远是最冷血最不动感情的,特别是在任务中,狙击手的训练就有关黑房子的训练,将我关在一个黑房子里,吃喝拉撒都在这暗无天日,没人和我说话,甚至连风声都听不到,就这样关个10天8天,正常人要这么关着,估计已经疯了,看来我是个不正常的人,还有长途单兵拉练,狙击手是训练最多的,这些都磨练了我的性格,直到现在,很多朋友都说我性格有些古怪,不怎么说话,但一说都是中要害的话,我可以好几天不出门,不看电视,捣鼓我喜欢的东西,怎么也不象个现代的城市青年.

    很长一段时间,人质事件都是我们谈论的话题,每一个细节都让我们津津乐道,让没出任务的其他战友羡慕不已,我也成了他们心中的英雄任务,一枪一命,狙击手最高的境界,我做到了,兴奋伴随了我很长时间,接下来依然是训练,和边防巡逻,任务过后没多久我获准探亲假,回到了南宁,下车是晚上挺晚了,没有公车,出租车对我一个月200多块的津贴来说太贵了,于是我拿出长途拉练的气概来,从火车站走回预备役军区,(东葛路)一路上兴致勃勃的看南宁.

    我两年多没回来了,走到快到民乐路的时候,我忽然听到有个女子的呼声,"抢劫啊~~"不一会,一个青年慌慌张张的从个拐角跑出来,我往树阴里缩了缩,待他从我前面跑过的时候,伸脚别了他一下,他爬起来,扔下个包,没命的逃了,我没兴趣追他,我拣起包,向刚才呼救的地方走去,没有人,民乐路空荡荡的,看来失主走了,我习惯性的找了个路灯检查了包,包不大,里面有个钱包,328块6毛钱,还有两个一快的硬币,一盒名片,一些女生的化妆品和个电话本,一个BB机,名片上是凝,一个很好听的名字,或许是个美女,名片有公司地址和电话,但没家庭的,我想,明天我去她公司一趟,把东西还给人家.

    第二天,我睡了个懒觉,呵呵~~很久没这样睡了,一觉睡到了下午1点,吃了点东西,我想起要去还东西,穿什么衣服好呢??我读书的衣服穿不下了,样式连我也觉得土气,迷彩服好象跟城市不般配,最后我抄起了我爸爸的衣柜,穿了我爸爸的中校制服,顺带连肩章也带了,我发觉原来我很帅的嘛,根本不象以前在部队里脏兮兮的,我来到了解放路,就是名片上的公司地址,门卫不敢拦我,直接来到了他们公司,门口有个礼仪小姐很礼貌的问我找谁,我把名片向她亮了一下,让我等着就进去了,过了一会,她出来说,进去吧,她在XX房间等你,我就进去了,柃着一个女士小包穿过那么多公司职员的好奇目光,我觉得怪不好意思的,来到XX房间,门没关,我看到里面有个女骇坐在电脑前,阳光从窗口射近来,只看到侧面,穿着短裙,修长的腿,手指有节奏的敲击键盘,恬静的面容,我忽然觉得,

    完了,我被狙击了,在我最不提防的时候,我被狙击了,只不过,不是子弹!

    我推开门,喊了句:报告!身后一阵轰笑,原来还有那么多人看着我,我依然不动声色,狙击手在任何情况下都不能乱,虽然我的心跳得很快,她诧异的抬起头,这是张天使的脸,问我,你是??我说,我是来还你东西的,把包递给她,她很奇怪,我说,检查一下,丢东西了吗,昨天我拿回来找你的时候没找着,就找到这来了,她检查了一下,说,谢谢~没丢东西,我觉得她天生是个狙击手的材料,似乎丢东西的不是她,拿回东西后她似乎也没有高兴和兴奋,只是优雅的淡淡一句谢谢,我说,不客气,没事的话我就走了,我正要转身,她说了句,我该怎么谢你呢中校?

    这可能是我的一个机会,我可不愿意放过任何一个和她在一起的机会,我说,你可以请我吃饭,我很久没吃过一顿好饭了,她笑了笑,那你等我下班吧,5点半,等的了吗?几个小时而已,当然等得了,她给我倒了杯水,让我坐在沙发上,就忙自己的事情去了,似乎我根本不存在,我就这样静静的看着她,她象个女神,恬静,优雅,有特殊的气质的女神.

    我们在继德餐厅吃饭,是个小餐厅,人不多,是个聊天的好地方,我不善聊天,他让我点菜,我看看菜单,都是好东西啊,还不知点什么好,吃饭的时候,她问我,你这么年轻就是中校了?? 我脸红了,说,衣服不是我的,我只是个士兵,我昨夜刚回来,没衣服穿,就穿我爸爸的出来了,她哦了一声,问我是什么士兵,在哪里服役等等~我斟酌着回答她,之后,我送她回家,到了楼下,她回头对我说,士兵,明天我休息,你不是没衣服穿么,要不要买衣服,正好我也要买,一起去吧,当然要买,我赶忙答应下来,她又说了句:别穿你老爸的衣服了,跟你年纪不配,那么年轻就是军官,会有人查的!是,我回答,她笑了,说,我不是你的领导,不用这样跟我说话,放松点,我能吃了你??

    第二天,我还是找不到衣服,就去隔壁借.隔壁的老哥顺手把一件黑色的警察作训服扔给我,我就穿着一身黑出门了,结果,她穿了一身白色的运动服,见到我,象打量外星人一样打量我,你是不是真的没衣服穿啊?昨天是军官,今天变警察了,你就没其他的衣服了吗??我真没有其他衣服,她的眼神让我很不好意思,不过,我说,你白我黑,黑白相配嘛~!她笑笑,跟你走很别扭,你离我远点啊

    虽然她这么说,但是我并没有离她很远,若即若离的保持着距离,这是我最开心的一天,我们都买了几件衣服,晚上还是到继德餐厅吃饭,我还请她吃了几个冰激淋,看不出她竟然那么能吃甜的东西,我真希望假期长点,永远不会结束,我很希望能追她,让她做我的妻子,可是我不能,之后,我们一直保持联系,但是关系永远是这样若即若离,似乎象两条偶尔相交的平行线,各自回到了自己的轨道,直到现在!

    这是我真实的经历,回来之后,我的很多朋友都喜欢听我讲部队的故事,很多人觉得我不一样,似乎我永远不会生气,眼睛里似乎藏着什么永远让人看不透的事情,其实,特种士兵并不神秘,所以,我想慢慢的将我的故事讲出来,非常感谢大家对我的鼓励,这种鼓励,我很久没得到了,有时候,我觉得我没有目标,或许这是社会和部队的区别吧,而现在,我的目标就是整理思绪,将我的故事说出来.

    休假很快结束了,我和凝的关系依然停留在普通朋友的阶段,她看得出我的意思,而我却永远不会表达,回部队的时候,她没来送我,我打她呼机,她依然的淡淡的哦了一声

    火车把我的人带走了,而我的心却永远留在了她这里.
    多年以后,她这么跟我说,其实不是没给你机会,那时候,你只要勇敢点,牵我的手,我就会答应你了,我错过了最好的机会,她说我胆小,也许吧,部队是不允许恋爱的,况且,我和她相隔千里,如果有缘,她会等我的,我只能这样安慰自己,或许,我才是她的目标,曾经很想命中而后再也没有兴趣的目标!直到现在,她依然和我若即若离,就象游离在我的世界,游离在我的准星边,而我,却永远打不中!

    大山,营房,战友,我又回到这个熟悉的驻地,每天的事情永远安排得井井有条,部队有部队的规矩,禁止这样,禁止那样,而狙击手被禁止的东西最多,别的战友可以在训练间隙抽烟解困,而狙击手不性,因为烟会影响夜视能力,每天除了和战友训练同样的科目外,还要练习瞄枪2个小时,体会不同子弹,不同距离,不同温度,不同环境下的弹道,驻地旁边的大山就是我们的训练场,经常在那里进行野外生存训练,另外,还要到10万大山,秦岭等等地方训练,我们每天的事情基本就是,起床,跑步,训练,吃饭,种菜,看新闻,唱歌,睡觉,这里与世隔绝,离最近的小镇还有4个多小时的山路,连队里的车除了一辆破吉普经常出山外,很多东西都是自己自足,每个月会有一天让我们出山,但是大多数我们都不愿意出去,山路难走,有任务军区会派直升机来接我们,小镇逛过几次也没兴趣了,10分钟不到就可以走完整条街,我们也不缺什么东西,部队什么都发,鞋子,军服,牙膏,香皂,我们也用不着买什么东西,休息的时候,我们会拿着56半,跟连长和指导员说一声,到山上打猎,一般来说,晚上我们都会有加菜,全连100多人,大家都是很熟悉的,战友情是最真挚的情谊.

    在部队里,最重要要和炊事班长搞好关系,曾经有战友跟他起口角,结果他一连半个月都是青菜萝卜的招待我们,吃得我们见到就吐~之后,那个战友专门跑出山买了条烟道歉,我们才过上了正常的伙食生活,我还记得炊事班长叼着烟卷说的那句话:小样的~~治不了你们俺还叫兽医~~这句话成了经典,我们之后经常引用.

    日子过到了99年3月,一天晚上,军区来人,还抗了放映机,开始我还以为是放电影改善生活,后来才知道,放的是有关毒品走私和枪支走私的影片,之后,军区的人就走了,而我们的日子开始改变,接连几天,连长和指导员都在商量着什么,我们隐约感到跟上次的电影有关,过了两天,连长集合开会,说明了军区的决定,要将毒品和枪支走私控制在境外,也就是说,原来我们只在国内打击,现在,要把战场开拓出去,在境外打击犯罪分子的嚣张气焰.我们热血沸腾,纷纷要求第一个执行任务,而我,似乎没觉得怎么样,狙击手的性格就是这样,永远用旁观的姿态来冷冷的看待任何事情.

    后面的日子里,经常有直升机光临驻地,一批又一批的小队出去执行打击任务,我们小队还没轮上,我不着急,我知道,虽然以前部队也出去执行过类式任务,但从来没有那么大规模过,现在军区需要评估作战效果,前面出去的基本都是些老兵,他们不光是执行任务,还要将第一手的地形资料等带回来,而且,大多情况下,他们只是执行侦察任务.

    4月份的一天,连长通知蓝狐小队做好出击准备(蓝狐是我们给自己的班起的名字,因为我们擅长渗透作战)12个人塞进了"河马"到了军区待命,我们12个人是经常配合的,非常有默契,3个渗透人员,两个狙击手,一个队长,一个医务兵(背电台也是他)一个机枪手,还有四个是突击手,当然,这是一般情况下的安排,很多时候,根据不同的情况来调整,特种部队的队员的专业是相对的,我可以去做渗透队员,其他的同样也可以代替我的位置.

    我们领到了任务简报,两个目的,摧毁一个毒品加工厂,它坐落在一个山谷河边,解决掉一个贩毒头目,据说此人来头不小,在缅甸很多地方部队和政府军打过工(部队里的幽默)现在自己做老板了,而且拉了百十号人,几十条枪,建立了自己的地盘,不光贩毒,还捎带走私枪支和控制了个赌场,第二个目标就是干掉他,报不会说太多,明天凌晨直升机会送我们出去,之后就靠我们自己走路了,3天后,直升机会在指定地点和我们汇合,把我们带回来,情况有变的话,每天有个开机时间通知.

    "河马"带着我们向夜空挺进,贴着树梢飞行的"河马"娴熟的躲避障碍物,飞行员看来非常熟练,我们毫不理会"河马"头顶上引擎巨大的轰鸣和剧烈的颤动,抓紧时间眯一会,接下来的三天可没有休息的时间,到达目标前5分钟,河马的飞行员开始报数,机舱打开,机腹下面是一团团黑色的山,红灯开始亮起,我们检查各自装备确认无误后,直升机扔下几根绳子,绿灯我们开始速降,河马的安全悬停高度是20米,但是山脉会有不确定的侧风和上升气流,林区高大的树木几乎没有那么底的,因此,我们基本是从50多米的距离开始速降,渗透组和突击组先下去,建立警戒线,然后狙击手,队长,医务兵,速降完后,一个机务人员收上绳子,用大拇指打了个手势,"河马"潇洒的转身离去,现在,剩下的事情就只能靠我们了.

    线路是事先就选择好的,虽然没来过此山,但我们觉得跟国内的基本没什么区别,渗透组的两个前锋侦察在我们前方开路侦察,我们以V字队型按预定线路前进,当晚就推进了一半多,白天稍休整一下又继续出发,中午到达目的地,一路上没什么事情发生,就象训练中一样,队长和我用望远镜观察目标,并在地图上进行修正,将所有可隐蔽和开阔地带,建筑物都标明出来,大家集合讨论了一下,渗透小组的主要目的是搜索毒品仓库和生产车间,并将炸药放在重要的地方,突击组在引暴之后负责接应渗透小组出来,狙击手和机枪手选择阵位进行掩护,队长亲自带领突击组,而我和另一个狙击手(猎鹰2号)负责监视和掩护.发现286(目标代号)其击毙,医务兵帮机枪手上弹,大家休整了一下,各人开始寻找阵位,渗透部队也悄悄的出发了晚上永远是渗透的好时光,渗透小组慢慢的爬到村里,应该说是军营里,一间一间的搜索,而狙击手要给他们提供预警,晚上,渗透小组从10点多爬到凌晨4点多,将炸药都已经安放好,突击组也到达预定位置准备接应,现在唯一的问题是,286没有露面,军营里死气沉沉,渗透小组的一个战友(胡狼3号)又重新回头进行了一次搜索,依然没有发现286,怎么办?命令是如果没有发现重要人物,炸了仓库和加工厂就可以了,不过我们的直觉认为,他就在这里,不会错,只不过我们暂时没发现,渗透小组接应出来了.

    炸弹是遥控的,如果没有被发现,我们会等结果了286之后引爆,并且,炸弹还装了诱饵装置,一般人乱碰一样会炸,突击组和渗透组另外选择了阵位,如果目标出现而狙击手和机枪手又打不到的情况下,他们会强攻进行肉体消灭.

    这个军营被包围了,被我们12个人包围了,从昨天下午开始,我就在数他们的人数,一共80多人,衣衫褴褛,大多数人很瘦,赤着脚,抗着AK47步枪,他们毫不知道,300米外的丛林里,有一双冷冷的眼睛在监视他们,我们已经两天没睡了,想早点结束,然后回去,美美睡一觉,时间不等人,时间拖得越久,我们回去就要越赶,早上,太阳爬出地平线,天有点阴,没多久就下起了雨,林区的雨来的快,来得猛,但去得也快,太阳重新出来,光线很好.

    我们趴在阵位上已经10几个小时了,该死的目标还没有露面,大雨过后,估计他们的房间防水功能不咋的,开始有人拿被子什么的出来晒,吵吵嚷嚷的,几乎所有人都出来了,如果有炮兵,这可是个一网打尽的好机会.

    目标终于露面了,我心里暗暗高兴,在单兵电台里简单的汇报:目标出洞,在正屋,目标也在大声嚷嚷什么,估计是赶他们回去干活,队长简单的说了句:行动!我的枪就响了,300多米,这个距离我可以把一只麻雀从树枝上打下来,目标被子弹强大的冲击里打转了个身,背朝上趴在了地上,后背是子弹穿出后的一个大血口,目标抽搐两下不动了,"目标终结"我简单的再次汇报.

    炸弹也响起了,他们大多数惊慌失措,象没头苍蝇一样到处乱窜,在炸弹旁边的被整个的抛上10几米摔了下来就不再动弹,我们用了燃烧弹和炸药混合,不一会就燃起冲天大火,我在瞄准镜里冷冷的看着这一切,搜索着有可能会对我们造成威胁的目标,混乱,一团混乱,他们根本不知道发生了什么,几个大胆的拿着枪漫无目的的乱射,大多数人已经惊恐万分,我们看着他们,谁都没开枪,目的已经达到了,没必要冒暴露的危险多杀几个,队长评估完作战效果之后,整个营地都被破坏了,效果不错,队长下令撤退,我们重新集结,狙击手殿后全程掩护大部队撤离.

    任务完成得很好,两个目的都达到了,剩下的就是向指挥部报告情况,然后等直升机,我们在预定的时间到达指定位置,上了直升机,我们面无表情的看着下面的山.合上疲惫的眼睛眯觉~ 目标被击中的一瞬间他在想什么?我忽然想起这个问题,刚才混乱的场面在我的脑子里一回有一回的重房,一个16,7岁的孩子恐惧的眼神在我的瞄准镜里看得清清楚楚,这是战争么?我没有得胜的喜悦,他们衣衫褴褛,赤脚的形象跟我在电影里看到的毒枭大象径庭,复杂的心情,我在直升机上睡着了.

    我只是个士兵,我永远要忠于我的祖国,永远要听从上级的命令,这是教官以前对我们所说的,我想,慢慢的我会理解的


    在亲手结束每一个鲜活的生命时,你会不会感到莫名的恐惧?会不会有后怕 会~但是我是名士兵,我的责任就是完成上级下达的任务,掩护队友的安全,在任务中,我不会搀杂任何个人感情,他们在我的眼里,只是个"目标"就象731部队中的"马路达"虽然比喻得不好,但这是事实. 我们也有不打的"目标"老人,女人,孩子,这些目标虽然在上级眼里同样是目标,但是我们会尽量的避免这些目标,如果有必要,我们会推迟行动时间. 从部队出来后,我也时常想起以前的任务,总之,感觉很复杂

    单兵拉练

    执行了几次类似的任务后,部队又要进行长途拉练了,这次是去秦岭,一个传说有野人的地方,在训练营的时候,我们也去过,不过那时侯只是在浅山(相对而言)转转,没有深入内部,这次主要是狙击手的单兵长途拉练,也就是说,没有队友,只有一个人,在规定的时间内到达指定目的地.

    我们来到军区,乘直升机到达前哨,简单的介绍了安全事项后,休息,明天一早,直升机会把我们都扔到200公里外的深山里,没有人烟的地方.

    晚上,直升机不断的起飞降落,那是投送其他特种兵的,狙击手明天才会出发,我们要在指定的地点狙杀模拟"目标"然后还要躲过其他特种小队的搜索,如果被抓住,就算任务失败,趁着还有时间,我再次检查了我的装备,这是我的习惯,装备检查多几次并不麻烦,野战刀,开山刀,医药盒,棉线,针,鱼钩,鱼丝,细铜丝,发烟弹,绳索,镁条,不湿火柴,牛油蜡烛,水壶,背囊,备用袜子,压缩干粮,雨衣,伪装网,指北针,手表,画图笔,我仔细的检查了所有装备,将该加固的地方加固,为期一个月,谁知道回发生什么事情.

    第二天一早,门口吹起了哨子,"狙击手!集合!!该你们了~"我们集合完毕,每人发了一支85,一支54手枪,把信号枪,地图,带队的是个少校,他问,大家还有问题吗?我说:报告,能否不带手枪,给我个水壶.少校准许了,其他的狙击手也纷纷要求撤掉手枪,这可不是开玩笑,远路无轻担,手枪对我来说没什么用处,我宁肯多带个水壶,长途拉练是个望山跑死马的活,所有的装备加上来快35公斤,虽然地图上只有100多公里,但是要算上迂回,爬山,100还要乘上好几倍!

    飞了半个多小时后,直升机开始丢人了,每隔10分钟放一个下去,我不知道会在哪里把我放下来,直到下飞机前,少校才会把我们目标的坐标告诉我们,该我了,少校大声喊"猎鹰~!!速降!!"河马的声音太大,面对面都要喊才听得见,我站起来,旁边的战友,拍拍我的背鼓励我,我熟练的从直升机降到地面,隐蔽到丛林中,开始在地图找我所在的位置。

    地面是软的,原始丛林的地面上堆积着厚厚的树叶,上面的是刚落下的,下面的却已经腐烂成泥,散发着令人作呕的腐臭,很快,我用指北针找到了我的方位,我在地图上标出了目标方位,运气不错,离我只有70多公里,不过中间隔有一座湖,旁边还有沼泽,看来要绕道,这样算算差不多会有200公里的路,我还要预备7天左右的找寻目标狙杀时间,还有2天的逃命时间,算算还有21天可以用,对于我来说,时间足够了,运气好的话,我还可以碰上个同路的,一个人总比两个人无聊得多.

    时间充足,我先用开山刀和野战刀砍下些树枝,做了把弓和一些箭,虽然我有枪,但是不能轻易使用,因为如果打不中猎物,枪声会把方圆十里内的动物都吓走,那么我可能就要饿上一整天,何况,我能打的猎物大多都不是大家伙,用枪太浪费了,陷阱和弓就可以应付了,压缩干粮只是3天的量,两个水壶的水可以够我用3天,万不得已轻易不能用,信号枪我把他放在背囊底,我可不想用它,对东西进行了分配后,我出发了,朝第一个目的地进发,路上顺手抓了条好奇的蛇,今天的伙食看来不错.

    下午6点,我到达第一个宿营地,地图很精确,几乎没费劲就找到了水源,采了些蘑菇就着蛇煮了碗汤,剩下的蛇肉我在火上烤成肉干,可以保存1个星期,走路无聊的时候也可以拿来做零嘴,我再次检视了我的方位和地图,天还早,那么早睡不着,我用头盔做了个陷阱,不一会就抓到了好几只倒霉的老鼠,我将它们也弄成肉干,晚上10点,我爬上大树,找了个树叉睡觉,我开始怀念我的硬板床.夜空里传来阵阵风声,有时候还夹杂着野兽的吼声和惨叫,这是掠食动物在捕猎,我可不想成为他们的猎物

    凌晨4点起床,我找了个地方蹲下来,准备好弓箭,这时候是动物喝水的时候,昨天我在水源附近发现了很多脚印,今天运气好的话,可以准备点粮食,等了一个多小时,就来了个黄獍,鹿的一种,比山羊还略小些,运气不错,它很小心,一步一望,随时准备逃走的样子,原始丛林生存不易,几乎任何时候它都要保持警惕,虽然它很小心,用鼻子在空气中嗅着,但是它没发现我,风向我是计算过的,它在上风口,根本不会闻到我的气味,它终于下定决心喝水了,先快速的喝了两口,立即又抬头四处张望,还不是时候,等它完全放心我再射击,那时候命中的概率更高,我离它大约20多米,弓虽然可以射到,但是不要低估了野兽的反应能力,或许箭还没飞到它面前它就已经逃之夭夭了,况且,它现在是正对着我,目标不大,它终于放心的大口大口的喝水了,看来它很渴。

    机会来了,我慢慢的直起身,拉开弓,忽然,离我不到10米的地方,窜出个东西,动作快得我都看不清楚,本能的,我将弓转了过去,这是只豹,动作敏捷优美,在空中划过一道弧线,黄獍反应过来的时候已经迟了,豹一掌将它打翻,一不可思议的速度咬住了它的喉咙,黄獍哀鸣几下就不动了,豹松开口,添添嘴上的血,左右看看,它看到了我,离我只有20米的距离我们对峙着,我悄悄的将野战刀握在手上,眼睛一直盯着它,它也盯着我,我的脑子快速的转动,这个距离上,豹可以很快的冲过来,而我并没有把握用弓射到它,我要等它扑过来的一瞬间,用野战刀刺穿它的肚皮,这是野兽最柔软的地方,如果不成功,估计我也会变成它的美餐,就这样,我们对峙了10多分钟。

    我冷冷的盯着它的一举一动,它开始也用戒备的目光盯着我,而且还不时的龇牙威胁我,我一动不动,野兽一般不会攻击人类,人对他们来说是个未知物种,除非它很饿,或者我去抢它的猎物,现在它刚刚猎杀成功,我不轻举妄动,它是不会主动进攻我的,慢慢的,豹的戒备的眼神变成了迷茫,迷茫变成了好奇,或许它在想,我是个什么东西,怎么从来没见过?好奇变成了无趣,它对我丧失了兴趣,带着它的战利品走进了丛林.

    我的美餐就在瞬间易主,它是什么时候埋伏在那里的??我怎么没发现,或许它比我更早的在那里等待了,我开始庆幸,刚才我埋伏的时候轻手轻脚,要不然,变成美餐的也许是我,两个猎手,相距不到10米,看上了同一个目标,这或许也是个有趣的事情,今天我不再无聊了,我可以用一整天的时间来想这个有趣的问题.收拾好东西,环境打扫好,我踏上了下一个目的地.

    今天的目标是走20公里,沿途我一边想豹的事情一边默数脚步,我的跨步每步大约是60厘米,野战环境下,就靠脚步和指北针来计算和修正距离,每2个小时休息10分钟,顺便检查装备,负重行军体力消耗很大,所以,我要匀速前进,不能走太快,而且,还要根据坡度等环境情况来调整身体重心,路上,我砍了几支长直的树枝,原来的箭不行,只是很简单的将前面削尖用火烧了一下,箭羽也是简单的树叶,没有找到好的箭头材料,弓也只是单弓,弹性不好,弓弦是用铜丝绞的,铜丝还有更重要的作用,还要找更好的弦料,一路上,不断的吃些肉干补充体力,每次一点点,不能让肚子饿着,否则,体力很快就会耗竭,水没问题,丛林里可以喝的水很多,只要你会找,渴是渴不着的,现在重要的问题是盐份不足,如果不补充盐份,3天后我就会感觉体乏,头晕,路上还拣了几块燧石.

    下午3点,我走到个丛林开阔地,这里是丛林中的广场,丛林里寸草不生,这里的草很高,旁边和树林交界的地方还有灌木,有一条小河蜿蜒穿过,好地方,今天我要补充多些食物了,运气真的很好,我竟然发现有桑树,虽然长的不大,但是用来做弓可是好材料,我选择了几根比较好的树枝砍下来,来到河边的拐角,我的盐份也有着落了,我把备用袜子用刀切开,作成个兜,在河边网浮游生物和植物,别小看这些东西,丛林里富含盐份的地方要么是矿盐,要么就是这些小东西,那边,我把裤子脱下来,做了个拦堰,网住从上游下来的小鱼小虾,很快,我就弄了一头盔的浮游生物,裤子暂时不用理它,我生火将浮游生物用头盔炒干,这些就是我今后的盐了,而且,还可以拿来做汤,到河边洗了个澡,将裤子提上来,收入不错,抓到了7条鱼,虽然不大,但是也够我吃两天了,现在我的时间充足,今天就走到这吧.

    我要准备足够的食物,在狙杀目标前的至少3天,我会碰到对方的巡逻队,那时侯,我不能生火,我可不想饿上那么些时候,吃了晚饭后,将鱼烤成鱼干保存,我重新做了个复合弓,这个好多了,用燧石打制了几个箭头和一个梭镖头,现在,我的武器升级了,不过还缺好的箭羽和弓弦,箭羽最好是用鸟羽毛,不过现在我还没抓到过鸟,暂时还是用树叶代替.

    第三天,线路非常好走,顺着山脉就行了,体力消耗也不大,路上碰到了些好奇的猴子,唧唧喳喳的从我头上跑来跑去,呵呵~~看来我有水果吃了,我拣起树下它们跌落的果子砸他们,猴子不甘示弱,纷纷向我投弹,差点没把我的头给打肿了,果子不太好吃,有点苦涩,不过他可以补充维生素,一个人长途行军是很无聊的事情,所以,要会自己找乐子!

    傍晚,我已经超额走完今天的路程,要找宿营地了,山脉不能一直走下去,在走我就走到北京去了,上山容易下山难,费了很大牛鼻子劲才下了一半,下面是陡坡,我找棵树用绳索打了个绳节,绑上两个石头扔下去,没有石头的重力,绳子很难扔到下面,灌木和树枝会挡住绳子,到时候又要费很大劲才能把绳子收回来,石头带着绳子坠下去.

    忽然听到下面有个愤怒的声音:哪个部分的,不要乱扔东西!!呵呵~~看来碰到其他侦察兵了,我回答,单兵拉练的,你哪部分的??他回答:军区特勤大队的,你下来吧! 我下来一看,一共有5个人,看来是渗透训练,武器是95式突击步枪,狙击手是88式,特勤大队总是能先装备新式武器,不过我奇怪的是,有一个带着相机,还有一个女兵!我听说军区组建女子侦察连,不过从来没见过女子侦察兵,而且还是夹杂在特勤队里~!!

    特勤大队是昨天晚上下来的,今天走了一天,很凑巧,选择的线路有部分和我一样,领队的是个上尉,他们叫他高连,是个连长,带相机的是军区的随军记者,来拍特勤大队训练素材的,女兵是新组建的女子侦察连的新兵,跟着来感受生活,前方还有两个前锋侦察,他们预定是晚上8点宿营,于是我又跟着走了一段.

    高连是个孔武有力的人,1米7,8左右,眼神很威严,看来是个带兵的老手,大家行军都不怎么说话,这是规矩,在丛林里,交流是用手语进行的,轻易不会讲话,随军记者带着近视眼镜,一路上嘟嘟囔囔,一下是路不好走,一下是负重太重,一下是累了,高连看来是忍了很久了,他忽然大声吼了一声:你 -他- -妈- 的-要享受就拉信号弹给老子滚回去,再说话老子毙了你!!!

    我们毫不理会,机关兵就这鸟样,平时吹牛可以,真正拉出来练练就鸟毛都不是.记者不敢说话了,低着头继续走路,气喘的跟狗一样!女兵一声不响,军装穿在她身上不怎么合身,不过隐约看出身材还蛮好的,她很累,但是她努力的跟上大队的步伐,气喘吁吁,我跟着她的后面,有些不忍,她们教官没教过行军的呼吸要领吗?我小声的提醒她:战友,不要大喘气,深呼吸,慢慢来,别着急.过了一会,她没那么喘了,回过头感激的看了我一眼,眼睛亮晶晶忽闪忽闪的,脸不是很美,不过很耐看.

    前锋侦察已经选好了宿营地,是个林中小空地,大家散开做各自的事情,高连和他的狙击手在研究地图,两个侦察兵出去营地巡查,其他的各做各的事情,女兵暂时没事情可做,想看高连怎么研究地图,不过又有点怕,远远的站着,记者同志已经累成一滩烂泥,高连研究了一下,叫我:狙击手,过来看看,我走过去,高连问我,狙击手,你叫什么??猎鹰,我回答,帮我看一下,明天我们怎么走好些? 我看了看他们的地图,果真是渗透作战训练,目标离这里还有50多里路,如果快的话,明天傍晚之前就可以赶到了,目标是个小山谷,有几条线路可以到达那里,我建议他走最近的线路,他摇摇头,三个研究了半天,意见不太统一,高连的意思是进行远程狙杀目标,渗透进去拿文件,狙击手的意见是靠近狙杀,山谷四周可以选择的狙击阵位在地图上看,在85式是足够的了,不过88式狙击步枪射程只是适合狙击600米内的目标,太远命中精度就大打折扣,低近的话狙击手的安全就有威胁。

    女兵还远远站着,她不知道该干什么,有点不知所措,其他的人各干各的事情,没人搭理她,我有些不忍心,招手叫她:战友,你过来,她看看高连,高连有些不耐烦的说:过来吧

    最后的决定是走最近的线路,然后进行渗透行动

    晚上大家随便聊聊,记者同志已经鼾声大起,高连鄙夷的看着他,嘴里骂了句:妈 的,猪!! 女兵离我们远些地方做好了她的床,但是她不敢睡,怯怯的看着我们,似乎在等什么指示,我们东扯西扯,女兵看来很委屈,自己轻轻的哼歌,声音蛮好听的,我悄悄的问高连:女兵是女子侦察连的?高连哼了一声:是啊,NND现在是特勤大队每个训练组带一个训练,真是累赘!!好好的文工团她不呆,来做什么侦察兵,这是她干的了的吗??我笑笑,女子侦察连我也听说过,好象都是些军官的女儿之类的,混个几年转地方或者提干,部队里就这样重男轻女,侦察兵不是个好差使,所谓的女子侦察连,在我们看来不过是普通的野战部队,她们都是有关系的,反正在侦察连里镀镀金,对她们将来有好处!

    早晨,我们就要分手了,我还有一大截路要走,高连对我说:猎鹰,缺什么我们有的尽管拿,这是部队不成文的规矩,单兵拉练碰到集体拉练的时候,我可以要些补给,毕竟他们人多,一人剩一口就够我用一天了,食物我不缺,不过我现在决定开个玩笑:我缺个做伴的,能把女兵给我么??高连哈哈大笑:小子,给你你也不敢吃,知道是谁的女儿么,军区副司令的,你不怕被毙了就拿去吧,女兵脸红红的,转过身不敢看我们,我笑了笑:开玩笑的,累赘你们带吧,我现在缺铜丝,和硫磺粉,给点吧,其他的就不用了,女兵给了我一根铜丝,然后想想,又打开医药盒,拿出些药品,说:带着吧,你一个人,或许用得着,然后,我跟高连告别,大家各自朝自己的目标走去!
  11. May28
    消失了N久,接下来恐怕还要消失,生活就是这样,因为这是生活!

    感谢大家的支持,在我消失的3个多月里依然有近7000的点击量.我只能在以后的日子里送上更多、更精彩的内容给大家,以表示我的感谢 !
  12. May28
    专辑名称:Mistyland 雾色山脉
    唱片公司:金格唱片
    歌手姓名:Bandari 班得瑞乐团
    发行日期:2006年01月12日
    专辑语言:纯音乐

    简介:



    班得瑞第11张专辑

    走出瑞士山林,寻找地球上最纯净人间净土

    收录《魔戒三部曲》May It Be, Into the West主题曲演奏版

    成军超过15年,如今已出版11张专辑的班得瑞乐团,直到目前仍无精选辑问市,只因他们的每首作品皆具主打格局,任何选辑,都无法完整呈现班得瑞乐团的音乐精髓.一向行事低调的他们,大部分的时间,皆置身瑞士山林里,除了收录难得听闻的自然天籁,每首创作的灵感都是与自然界互动的结晶,吸取存在天地间最贴近人心的原始脉动为节奏,早就他们的音乐,让人听一次就能深深印在心中.

    班得瑞除了以孕育其音乐灵感的瑞士山林为出发,更出走国境,让南美,爱尔兰,与东方的自然风光也融入创作中,歌颂无国界的大地恩赐与鬼斧神工的自然魅力.在编曲上除了运用结他,排笛,键盘等在乐坛奠定鲜明旗帜的配器外,更加重了弦乐组的表现,让音乐在空灵缥缈中,增添一份来自田园,沁入心灵的温暖情感.值得一提的是,他们重新演绎2首轰动全球的电影[魔界]系列主题曲,以其中的浩瀚场景为依归,融入班得瑞乐团的独特风格,成为新版的山林音乐.

    曲目
    Orinoco Dreams奥里诺科之梦

    Beyond The Memory Of Man曼岛的遥远记忆

    May It Be但愿如此<魔界首部曲> 主题曲

    Lonely Whistler寂寞口笛手

    Serenade In Green绿意小夜曲

    Adagio Of The Highland高地慢板

    Incredlble Stars奇幻银

    Crystal Ball水晶球

    World Of Difference异世界

    River Of Dreams梦河

    The Holy Garden圣洁花园

    Careless Eyes漫不经心的眼神

    Into The West<魔界三部曲-王者再临>主题曲

    The Lady And The Earl淑女与伯爵

    Dragen Heart龙心

  13. May28
    一.楼上传来弹珠的声音……



    这是个前一阵在网路里讨论的很热烈的话题,不可否认我也确实经历过这种事情.常常一个人在家的时候,或者是下午,或者是晚上,哪怕不是一个人在家,只要是家里很安静的时候.就可能听见楼上像是有玻璃球,或者钢珠,从高处掉落在木地板,或者很坚硬的地板上的声音,不停的弹~弹~弹..直到声音越来越小最后消失.



    我当初念中学时常常听到,也没太在意,认为楼上的小孩子掉东西太寻常了,何况那时候玻璃珠又不是什么好希奇的玩意.现在已经几年没有听到过了,但看到网路里突然有许多人经历过同样的事情,感觉越来越奇怪,甚至有人说住顶楼的人也听过,甚至有人说楼上从来没住过人的人也听过,越说越悬..让人想着脊背发凉,再仔细一想,我初中的时候也是住的顶楼啊,但我记忆中确定有初中时听到这种声音的痕迹!



    按网路上比较科学的解释,这种声音不是发自自然界的声音,而是来自于人的大脑皮层,由于疲劳或者什么什么原因,大脑里产生了这样那样的什么信号,然后导致什么什么效应...所以听到弹珠弹地声(由于科学的解释我没有仔细去记,所以只好用很肤浅的语句带过),就我个人来说,我是比较相信这种说法的.



    二.常常在做一件事的那一瞬间意识到,现在这个状态,这个事情,在曾经的梦里出现过.



    这也是最近网上讨论得比较热烈的话题,而且也是许多许多的人都有经历过的事情.也是让许多的人认为自己有预知能力的根据.不可否认,我也遇到过.



    在做一件事,举手的那一刹那,或者是踏脚的那一瞬间,脑子里飞快闪过一个念头:这情景在我梦里出现过!绝对!而且相当肯定.



    但不知道有一点大家是否跟我一样,就是在出现那样的念头前,我从来没有自然的想起这个梦,也就是说在那之前,我从来不知道自己做过这样的梦.



    人进化了数百万年,人的身上到底有多少潜能有待开发,我们还暂时未能下定论.但就目前的科学解释来说,梦境只是过去发生的事情残留在脑海里的印象,因此梦只能显示一些过去的事,或者这么说并不正确,应该是梦境只能显示残缺的,被我们潜意识里拼凑过的过去的印记.而不可能预知未来.

    如果大家都跟我一样,只是那一瞬间才想起有做过这个梦,而之前从未想起过这个梦的话,那上面的解释就更可信了,因为也许那并不是梦,而是人的一种直觉吧.亦幻亦真,让人不知其意义,于是感觉就跟是梦境里的事一样.



    三.入睡的时候,仿佛马上就要睡着,却突然感觉下坠,然后猛地惊醒.



    这个事情我是在一个论坛上看到的,我以前还是经常经常遇到这种情况.我也认为跟弹珠事件一样很自然很平常的.但看到论坛里这么多的人都在说有过这样的经历,我又开始觉得有必要去考究考究了



    因为他们的说法是:那是灵魂出窍的前兆.



    我虽然无法认同这种观点,但我觉得这种解释确实相当有价值.不知道大家是否经常遇到这种情况.



    我总是在比较疲倦的情况下,一挨着床,眼看马上就要睡着了,已经开始有点做梦的感觉了,结果突然猛的一坠!然后可能附带着还有脚的抽动或者手的抽动,然后突然惊醒.按他们的说法是,当灵魂正要飘离身体,却被身体警觉,然后猛然惊醒..



    不过,还是按科学的理解,我觉得应该是在人极度疲倦的时候,大脑比身体先进入睡眠状态的情况下发生的.一般来说,睡眠应该是身体先入睡,然后大脑慢慢进入睡眠状态(但同时仍然保持部分功能运转,也就是大脑不可能完全不转了),但这种情况出现时的大脑,应该是由于疲倦而过早于身体进入睡眠状态, 但却因为身体部分组织和机体的正常状态的运转而惊醒.
  14. May28
    http://swf.51.com/may28js/313364/51.swf




    切•格瓦拉之歌


    是谁点燃了天边的朝霞
    千年的黑夜今天要熔化
    也许光明会提前到来
    我们听见你的召唤:切·格瓦拉

    是谁指给我闪亮的星斗
    心灵战胜了虚荣的繁华
    在寻找家园的十字路口
    我们看见你的身影:切·格瓦拉

    是谁带领我重新出发
    正义的思想再度升华
    前进的路需要新的脚步
    我们跟你前仆后继:切·格瓦拉

    是谁站起来永不倒下
    身后的大地开满鲜花
    革命的意志百炼成钢
    我们决心和你一样:切·格瓦拉

    坚定我的心让红旗飘扬
    接过你的枪奔赴战场
    唱起你的歌就有力量
    走在你的路上我们有了新的方向

  15. May28
    1: 更换外观还不知道怎么用……
    2 : 网站速度比以前慢了
    3: 博客板块背景(中部)阴影似乎没有整体的呼应
    4: 还没想好……
  16. May28
    阿道夫·希特勒
    彼得·波罗夫斯基[西德]

    译者的话



    阿道夫·希特勒是世界现代史中具有很大研究价值的一 个反面教员。他创造了纳粹党,通过各种手段攫取了国家的 最高权力。第三帝国期间,希特勒疯狂推行迫害犹太人民的 种族主义政策和扩军备战的法西斯主义战争政策。从一九三 三年到一九四五年的短短十二年执政期间,希特勒先后制造 了一系列震惊世界的重大历史事件。一九三三年上台伊始, 他炮制了国会纵火案,大肆迫害德国共产党人和其他进步人 士,在国内实行了法西斯独裁专政。一九三八年,他以“合 并”为名,吞并了邻国奥地利。紧接着,他借口苏台德问 题,出兵占领了捷克。一九三九年九月一日,希特勒下令德 军根据《白色方案》中的第一号指令分兵三路进逼波兰首都 华沙,挑起了第二次世界大战,把战火烧到欧、亚、非各洲 以及大西洋、太平洋和印度洋,造成了数千万人民的死亡, 给世界人民和德国人民带来了极其深重的灾难。

    第二次世界大战期间,希特勒主持指挥了对英、法、美的西线战争以及入侵苏联的东线战争。与此同时,纳粹法西斯分子,主要是希特勒的党卫军在波兰和捷克等地建立起的集中营和灭绝营对犹太民族和世界各族人民犯下了令人发指的滔天罪行。

    《阿道夫·希特勒》一书以传记体裁,通过简炼的叙事手法,再现了上述历史事件的梗概,对于我们了解希特勒其人和纳粹主义的形成与发展以及了解第二次世界大战的主要历史脉络有着一定的帮助。

    《阿道夫·希特勒》一书的作者彼得·波罗夫斯基是历史学博士,观在西德汉堡大学史学院执教,专事世界观代史和东方政策的研究工作。作者在撰写此书时,对极其浩繁的历史材料进行了细致的精选,力求简明扼要,使本书基本上达到了篇幅短小、选材精炼、条理清晰的要求。

    本书根据汉堡德雷斯勒人文出版社一九七八年德文版译出。



    第一章 海关官员之子
    希特勒的诞生




    一八八九年四月二十日,阿道夫·希特勒出生于布劳 瑙。布劳瑙是位于流经奥地利和巴伐利亚边境的因河河畔的 一个小市。希特勒的父亲是那里的一个海关官员。第三帝国 时期,希特勒曾经向许多德园人索取过所谓雅利安人后裔的 证明,即证明他们上面三代人中间没有犹太人。可是,希特 勒本人恐怕永远也拿不出这样一种证明,因为连他也无法断 定,他的祖父究竟属于哪一种族。

    希特勒的父亲阿洛伊斯是一个私生子。阿洛伊斯的母亲 安娜·席克尔格鲁贝尔是一个贫苦的农家女。生阿洛伊斯那 年,她已经四十二岁,但仍然未婚。说起来,约翰·格奥尔 格。希德勒,一个从斯皮塔尔流浪而来的磨工应该是孩子的 生父,因为他在一八四二年娶了当时年已四十七岁的安娜。

    席克尔格鲁贝尔为妻。阿洛伊斯快满十岁那年, 安娜去世 了。阿洛伊斯主要是在斯皮塔尔靠他叔父约翰。纳波姆克。

    希德勒拉扯长大的,因为他的父亲约翰·格奥尔格·希德勒 又开始了他那流浪生活。阿洛伊斯十三岁那年离开了斯皮塔 尔,流浪到维也纳。在那里,他学完了鞋匠手艺,后来又去 奥地利海关署报考,在通过了各种考试之后,他成为—— 名海关官员。一八七五年,他终于得到了布劳瑙海关检查长的职位。作为来自落后林区的一个私生子,这在当时来说简直就是一个令人瞩目的平步青云,不仅是阿洛伊斯·席克尔格鲁贝尔本人,就连他那叔父约翰·纳波姆克·希德勒都为此感到自豪。

    一八七六年,约翰·纳波姆克·希德勒亲自出马,改动了阿洛伊斯。席克尔格鲁贝尔的出生登记。原登记栏中的“私生”被更改为“父名:约翰·格奥尔格。希德勒”。利用这次机会, “希德勒”这个姓也被改成为“希特勒”。



    威严的父亲




    阿道夫。希特勒出生的时候,他的父亲已经五十二岁了。阿洛伊斯仪表堂堂,颇具时代风度:矮壮、留着军人式短平头、浓眉并蓄有四十余年以来一直统治奥匈帝国的弗兰茨·约瑟夫皇帝式的大八字胡。阿洛伊斯·希特勒十分自豪的是他那套海关官员制服,常爱穿着它去照相。他被公认为是一个勤勉的克尽职守的榜样,颇得上司和同僚们的好评。

    在家中,他则是一个典型的十九世纪的家长,妻子和孩子们必须顺从他的意志。

    阿道夫·希特勒的母亲克拉拉·珀尔策尔完全俯首听命于她的男人,总是称他为“大叔”。她是他的第三个老婆,是约翰·纳波姆克的一个孙女,自然也是她男人的一个堂侄女,比她男人小了整整二十三岁。阿洛伊斯·希特勒的第一个老婆未有子嗣,第二次结婚有了两个孩子:小阿洛伊斯和安格拉。一八八五年,克拉拉· 希特勒婚后不久生下了第一个儿子,一八八六年生下一个女儿,一八八七年又得一子。但是,三个孩子都先后在出生后的头两年夭折了。 因此,克拉拉·希特勒尤其钟爱她的第四个儿子,对他十分娇宠,几乎从不让他离开自己的左右。克拉拉· 希特勒后来又生下了两个孩子;一八九四年生下了埃德蒙德,一八九六年生下了保拉。

    阿道夫·希特勒三岁那年,他父亲被上司调迁,举家搬 往巴伐利亚的帕骚市,那里有属于奥地利管辖的一个海关。

    在这个德国城市里的生活以及与德国儿童们的共同玩耍都给 希特勒留下了终生不泯的影响。整整一生之中,他都操着帕 骚时期学会的那种巴伐利亚南部口音。

    一八九五年,阿道夫·希特勒六岁时,他父亲奉调前往林茨赴任,全家又搬回了奥地利。在林茨郊外的哈弗尔德,希特勒一家住在一个小农庄中的一所漂亮的住宅里。房子座落在一块高地上,周围环绕着果树、核桃树,还有一条小溪。这里是一个理想的游戏场所。搬家后不久,阿道夫·希特勒被送到费什哈姆去上小学。每天早上,他要和他的异母姊安格拉把整整一个小时的时间花在步行上学的路上。弗什哈姆的小学是一个典型的乡村学校,学校很小,男孩子和女孩子被分开编在两个班里。当时的小学老师对希特勒姊弟俩印象颇佳,后来这位老师回忆说,阿道夫那时听课十分认真,遵守纪律,天真活泼。两个孩子的书包里,书本和文具置放得井然有序。


    阿道夫上学那年,阿洛伊斯·希特勒于工作了四十余年之后退休领取养老金。然而,他却很难适应这种退休生活, 于是开始酗酒,变得焦躁不安,易于激动。他要求家庭中必 须保持一种绝对的服从,这就导致了同日益长大成人的小阿 洛伊斯的;中突。阿道夫·希特勒的这位异母兄长后来报怨 说,他经常被他父亲用马鞭抽打得死去活来。阿道夫·希特 勒有时也遭其父毒打,但在其母那里仍是娇于。这种状况后 来糟得令人难以忍受,以致小阿洛伊斯。希特勒在十四岁那 年收拾了自己的衣物,离家出走。小阿洛伊斯走后,阿道夫 就成了他父亲那种教育方法的主要牺牲品和“出气筒”。
  17. May28
    成绩优良的小学生




    一八九六年,阿洛伊斯·希特勒开始厌恶乡村生活,他 卖掉了乡下的庄园,全家搬往拉姆巴赫,这是有着一个古老 美丽的本笃派修道院的小市。阿道夫·希特勒再也用不着在 庄园里干活了,但这里的学校比起费什哈姆的小学来,要求 却高得多。尽管如此,阿道夫。希特勒仍不失其为佼佼者。’ 在一八九七——一八九八学年的期末考试中,他连获十二门 “1 ”分①。他参加了寺院中的学生唱诗班,深深地为宗教 节日所激动,萌发了当一名牧师的愿望。在家里,他常常把 女佣人做饭用的大围裙当作法衣系在腰间,爬到餐室中的一 张高靠背椅上,滔滔不绝地发表着言辞热烈的长篇说教。希 特勒那位笃信宗教的母亲和他那位对于宗教只是表面敷衍的 父亲对儿子这种暂时产生的爱好感到十分满意。
    ① 相当于我们学校中的“5 ”分。——译者注。


    在拉姆巴赫,希特勒一家住在碾磨场的一所大房子里。
    孩子们经常在碾磨场这个理想的场地玩印地安人和美国西部牛仔的游戏。
    象从前在乡下时一样,希特勒的父亲很快又对这里的生活感到厌倦了。于是,他于一八九八年在林茨附近的莱昂汀村中买下了一所房子,不久便举家乔迁。到那儿以后,阿道夫·希特勒在学校旦学习亦很轻松。每逢休息和放学以后,他是玩印地安人游戏的孩子王,孩子们在游戏中模仿的英雄人物是卡尔·梅①。—年以前在南非爆发的荷兰—德国布尔人与英国殖民主义者之间的布尔战争②也激发了孩子们的狂热情绪。尽管希特勒此时年方十岁,也被当时德国舆论界大肆渲染的那种狂热的民族主义情绪所感染。
    在莱昂汀,希特勒发现自己有绘画天赋。于是,他转而幻想着成为一名“艺术家”。然而,他父亲却另有打算:长子小阿洛伊斯出走后杏无音信,埃德蒙德也病死于一九零零年;因此,他想让阿道夫·希特勒日后成为一个和自己一样的官员,当然官要做得大些才好。于是,他连哄带吓地想使儿子相信,仕途生涯受益匪浅。阿道夫·希特勒四年制小学毕业后,父亲决定送他到林茨市的六年制中学就读。
    ① 美国西部影片中的一个传奇少年。——译者注。
    ② “布尔”在荷兰语中是“农民”的意思, 实际上指农场主。历史上的布尔战争亦称英布战争 (1899—1902),是英帝国主义者和德、荷布尔殖民主义者之间争夺南非殖民统治的一场帝国主义战争。——译者注。



    令人失望的中学生




    阿道夫·希特勒在城市中学里一开始就是一个令人失望的学生。除了跟不上课这一原因以外,同班同学们也都瞧不起这个来自乡下的孩子,这所规模很大的学校里的老师也不象乡村小学中的老师,无暇顾及一两名个别学生。阿道夫·希特勒失去了攻读的勇气和兴趣。一九零零年——一九零一年的第一学年末,他终因数学和自然考试不及格而留级。
    翌年,他的学习成绩有了起色。他和同学们交上了朋友,每天下午在多瑙河畔的草地上象在莱昂汀那样一起玩印地安人游戏,打“布尔战争”。这一学年结束时,他不但升了级,甚至获得了“好”、“很令人满意”、“品行端正”、 “学习刻苦”的评语。可是,二年级刚一开始,老问题又重新出现,首先使希特勒感到吃力和难以跟上的还是数学。

    正当此时,希特勒的生活骤然发生了变化:一九零三年一月三日,阿洛伊斯。希特勒死于中风。

    父亲的溘逝成为阿道夫·希特勒生活中的一个转捩点。

    笼罩在家庭中的紧张气氛荡然无存,专制的父亲惯于使用的那种高压手段也销声匿迹。十四岁的希特勒现在成了家庭中唯一的男子汉,形单影只的寡母对他没有任何的约束力,甚至连家庭中的事务也要受到他的支配。母亲在经济上尚可说得过去,遗孀养老金和三个孩子的抚养费(直至二十四岁)
    使这个家庭仍然不失之为一个小康人家。
    一九零三年春,阿道夫·希特勒被送到林茨的一位老太太家中寄宿,这家同时还住了其他五位学生。在这里,希特勒的举止也显得与众不同,他不但对女主人,就是对他的那些同龄生也总是小心翼翼地以“您”相称。他离群索居,落落寡合,老是喜欢把自己关在房间里读书作画。由于他阅读的书籍很少与正课有关,因此当六年制中学的第二学年结束时,他的数学又未及格。秋天,他通过了补考,升入了三年级。随着升级接踵而来的是一个新的困难:他对作为第一外语所必修的法文颇感头痛。他当时的班主任兼法文教师于一九二三年回忆说:“希特勒无疑天资很高,虽然不甚全面。
    但他却缺乏自制力,至少被大家认为性格执拗、刚愎自用、自以为是和脾气急躁。显然,对于他来讲,在学校里循规蹈矩是件不情愿的事情。学习上,他亦不很努力,否则,凭他那公认的天赋无疑可以取得好得多的成绩。”
    当时的一位历史教员,莱奥波尔德·波兹教授给了希特勒很大的影响。他的那些关于古代日尔曼人的故事和授课时打出的那些幻灯片使得希特勒激动不已。通过这样的历史课,希特勒和他的许多同学一样成为一个哈布斯堡多民族帝国①的反对派,成为一个德意志民族至上主义者。当时这些人主张德国和奥地利合并,建立一个德意志大帝国,并在本来该唱奥地利国歌之时高唱德国歌曲。
    ① 指奥匈帝国。——译者注。


    中学三年级结束时,希特勒没有能够通过法语考试。补考虽然勉强及格,但却因成绩不理想而使他失去了继续在林茨的六年制中学里就读的机会。这样一来,希特勒就不得不转学到距离林茨市四十公里处的施太尔州立四年制中学去继续读他的四年级。在那里,他又住进了一间带家具出租的房间,倍感凄凉与悲哀。他憎恨学校,以阅读和作画来打发时光,无聊时还常常从房间里用汽枪去打后院中窜来跑去的老鼠。这一年的秋天,他又不得不再次进行补考,补考及格后领到了四年制中学的毕业证书。
    四年制中学毕业证书为他敞开了通向综合性高中继续就读的道路。但是,继续求学却不符合希特勒此刻的愿望。他利用自己肺部健康状况不佳为理由去说服自己的母亲,使她相信,中辍学业将会对儿子的健康有所裨益。
  18. May28
    在林茨市的“艺术家生活”



    现在,十六岁的希特勒开始主宰着自己的命运,他可以随心所欲地按照自己的意志行事了。父亲和学校已经沦为往事,再也没有任何力量能够阻止他去选择工作了。母亲对他总是让步,家里提供的食宿费足够支付他的花销。克拉拉.希特勒在此期间带着全家搬到了林茨市内,父亲前妻的女儿安格拉也出嫁了。

    从——九零五年到一九零七年的两年半光景中,希特勒在林茨过着一种无忧无虑的生活。他贪婪地涉猎书籍,大量作画,欣赏歌剧,参观博物馆,但所有这些几乎都搞得冷冷清清,似乎他对于进行社交活动没有丝毫兴趣。他是一个生活在梦幻世界中的落落寡合者,憧憬着日后成为一名著名的大艺术家。仅仅是在一九零五年的秋天,他总算是遇到了一位能够与之攀情道友的同龄青年奥古斯特·库比切克。库比切克也怀着同样的梦想,即成为一个著名的音乐家。库比切克和希特勒对于市内上演的歌剧几乎是场场不落,夜间则没完没了地在林茨的大街上闲逛。这两个年轻人合作得真可谓天衣无缝:希特勒滔滔不绝地讲,库比切克专注无言地听。

    毫无疑问,库比切克是希特勒在林茨的那些年月中最好的挚友。即使库比切克在他后来的那些回忆里也闻或出观过一些夸大其辞的地方,然而这些回忆仍然真实地反映出了十六岁到十八岁的希特勒的若干特点。这些后来日臻完善并在作为煽动家的希特勒身上体现出来的特点是:一种极端的落落寡合,一种带有自怜情调的唯我独尊和经常突发的一种压抑不住的演讲欲;此外,对于制定“宏大计划”抱有热烈的欲望,而对于任何一种按部就班和循规蹈矩的活动则都嗤之以鼻。希特勒的话题当时主要是围绕着音乐< 他当时是理查德.瓦格纳的崇拜者)和绘画,并且越来越多地谈到建筑。

    他画了大量富丽堂皇的建筑物的设计草图并且热哀于完成改造林茨市容的一系列计划。至于政治,他只是偶尔谈到。保拉·希特勒后来在回忆时说道,她和她的母亲常被她哥哥用冗长的历史报告搅得头昏脑涨,可是当时仍然毫无迹象可以说明,年轻的希特勒对于政治有什么特殊的兴趣。同样,也没有一点迹象说明,他在那个时候就成了一个反犹太主义者,或者说他对“犹太人问题”产生了一星半点的兴趣。当时,希特勒的母亲感觉到胸部作痛,曾到一位犹太医生爱德华·布洛赫博士那里去就医,这位犹太医生是当时林茨市里有名的“穷人的大夫”。布洛赫博士诊断她患有乳腺癌并劝她立即进行手术。当医生把病情的严重性讲给患者的子女们听时,她儿子那种悲痛欲绝的反应使这位医生深受感动。一九零七年一月十八日,克拉拉·希特勒做了手术。术后,她的恢复是缓慢的。



    被拒于艺术学院的大门之外



    一九零六年春,希特勒生平首次来到了维也纳。一连四个星期,他只是进出于歌剧院、话剧院和博物馆,并且给库比切克写了许多热情洋溢的明信片。至少此刻令他深信不疑的是,假如他要想在艺术生涯中有所建树的话,那么就必须去维也纳求学。于是,他千方百计地劝说母亲同意他到维也纳的自由艺术学院去就读。克拉拉·希特勒在儿子的愿望和女婿——同时也是孩子们的法律监护人——让希特勒学一门 “正当”职业的建议之间曾经十分犹豫不决。最后,一九零 七年的夏天,希特勒终于说服了自己的母亲,允许他从父亲 的遗产中提取了七百克朗,这笔钱恰好可以支付他在维也纳 一年的学费和食宿费用。

    一九零七年九月底,希特勒启程前往维也纳。十月初,他在那里参加了入学考试。考试的结果令人大失所望:希特勒名落孙山。当时,希特勒曾经试图让校方允许他做些解释,但却被告知,他的绘画技巧平平,实际情况说明他的天赋应该是在建筑方面。然而,要想进入学院的建筑系就必须出示建筑学校的毕业文凭,而进入这种建筑学校的前提则又是必须念完整个六年制中学并获得毕业证书。此时,希特勒面前云遮雾障,似乎无法迈步。面对现状,希特勒束手无策,神情沮丧。他没有给家中写信,也没有旋踵而返,却独自留在了维也纳,闭门谢客,埋头读书,听听歌剧或在大街上茫然无主地游逛。

    直到一九零七年十月底,他才乘车返回了林茨。他母亲此刻已经病得奄奄一息,他和妹妹一起承担了照料病人的义务。一九零七年十二月二十一日,克拉拉·希特勒离开了人间。圣诞节那天,阿道夫·希特勒和妹妹保拉·希特勒一道拜访了布洛赫医生,付清了帐目并对医生为病人所做的努力表示了谢意。后来,希特勒曾经不止一次地给布洛赫博士寄去了自己画的明信片,还有一次寄去了一张自画的水彩画,借此来再次表达自己的谢忱。一九三八年,“奥地利并人德国时期”,布洛赫和他的家庭被置于希特勒的特别保护之下,并可以根据自己的意愿随时离国旅行。

    可以肯定,希特勒的反犹主义思想绝非是由于他个人的经历所造成的,而是来源于其它渠道所造成的一种广义上的反犹成见,这种成见的力量大得足以抵消那种私人经历曾经给予他的积极影响。
  19. May28
    维也纳的“艺术家生活”



    母亲死后,希特勒完全独立了,在林茨再也没有什么值得他牵挂的了。他的异母姊安格拉承担了照顾他那十一岁的妹妹保拉的义务,为此,希特勒当时大概把母亲那笔遗产转到了她的名下。希特勒自己则留下了父亲遗产中所剩的部分和自己每年三百克朗的孤儿抚养费,这笔钱可以使他维持一种俭朴的生活。

    一九零八年二月,希特勒重新回到了维也纳。此次,他是和奥古斯特·库比切克结伴同行。库比切克想在维也纳学习音乐并且顺利地通过了入学考试。此事只是引出了希特勒一句干巴巴的评语:“我做梦也没料到,我有这样一位才智过人的朋友。”那一阵子,两人对皇家歌剧院中上演的理查德·瓦格纳的歌剧仍然是场场不落,但却没有一次看到终场,因为他们当时居住的斯旦姆佩尔街二十九号寓所的大门到时必关,而他们又掏不出足够的钱来贿赂看门人。

    当时的维也纳是哈布斯堡王朝行将覆灭之前回光返照下的灿烂帝都,臃肿管理机构的心脏,帝国最大的工业中心。

    贵族们那些富丽堂皇的宫殿和轮街两旁耸立着的雄伟壮观的各种建筑物使希特勒和库比切克心醉神迷。他俩也经常漫步通过市郊的工人区和贫民区,那里居住着无产无业的贫民以及来自帝国各个角落的那些被德意志人视为卑贱者的外来户。维也纳象一面凸透镜,这个多民族国家的民族冲突和贵族、资产阶级同工人阶级的阶级矛盾都在这里聚焦。

    库比切克后来描述了希特勒当时是怎样日益变得富于批判精神和反抗精神的。他常常为世道的不公和豪门贵戚们所榨取的不义之财而感到愤愤不平,并且试图透过哈布斯堡王朝帝都金碧辉煌的正面去洞察它那阴森暗淡的背影。当然,还不能据此而得出任何结论来证明他开始产生了为穷人和弱 者去铲除社会不平现象的觉悟以及主张与受压迫的人们实行 阶级大团结的愿望。希特勒当时主要抱怨的是社会秩序,他 本人把秩序视为他心目中应为之奋斗的荣誉和昌盛的一·个组 成部分。每当他漫步走过维也纳的贫民区时,心中所唤起的 只是他那作为城市建筑规划家的兴趣。散步回家,他每每投 入改建整个维也纳市区的设计草图的绘制工作,然而却常常 为了看一场描写日尔曼神话故事的话剧或者—一场极为平常的 歌剧而使这项工作时断时续,最后终于不了了之。

    正当希特勒如此毫无系统地从事着他那“艺术”工作期 间,库比切克在创作着乐曲,孜孜不倦地练着钢琴。他以优 异的成绩通过了第一学期的考试并且指挥了该年级的期末音 乐会。希特勒一方面为他的朋友感到骄傲,另一方面也不无 妒忌之意。一九零八年九月中旬,当库比切克回到林茨度假 期间,希特勒重振精神,又一次争取进入艺术学院。但是,他此次所拿出来的绘画作品所获评价极低,以致根本没能取 得参加入学考试的资格。



    流离失所的岁月



    第二次碰壁对于希特勒的自我意识来说,无疑是一次严 酷的打击。他素来把自己当成是库比切克的保护人,可他的 朋友此时却成绩卓然,而他本人则屡进屡踣。羞愧之下,他 断绝了同库比切克和在林茨的妹妹的一切联系,搬出了原先 与库比切克同住的公寓,在没有给库比切克留下一点音信的 情况下住进了弗尔伯尔大街西道大院对面的一间廉价的房 间。显然,他在斯旦姆佩尔大街的那一年中罄尽了父亲的那 笔遗产。到了观在,他所赖以维持生计的只剩下了那笔每月 二十五克朗的孤儿抚养费。不久,他又搬到西道大院的一间 更为窄小的房间中去住。最后,他的名字终于在一九零九年 八月间从户籍局的卷宗中消失了。在此之前,他曾经在该局 交替使用“艺术家”、“大学生”和“作者”的身份注册过户 口。在他于一九二三年以自传体裁撰写的喀我的奋斗》一书 中,希特勒把他在维也纳度过的这段年月称之为“我一生中 最悲惨的时期”。他回首往事说,直到他于一九零九——一九 一零年可以作为一个“无名的素描画和水彩画家”独立工 作以前,他不得不靠到处打短工、干下手活来谋生。他在书 中隐去了艺术学院对他的第二次打击。事实上,在一九零九 年剩下的岁月中,他压根就是一个流浪汉。他夜宿在公园中 的长椅上或随便哪家的大门洞里,白天在小酒肆和候车室中 以廉价食品充饥。

    当时,希特勒似乎根本就没有产生过为了改善仅靠孤儿抚养费来谋生的困境而去找一个临时工作的想法。他仍然象从前那样,自命为一个“艺术家”,蔑视一切 “糊口的职业”,并且认为作为一个真正的市民阶层的子弟而去从事任何一种形式的体力劳动都将有损于他的荣誉。至于他曾在建筑工地上打过短工的经历,不过是他自己后来杜撰出来的一个谎话。他诅咒“与他作对”的周围环境,寻找着对于他的不幸应该负责的罪人,把自己的一切希望默默地寄托在日后的“一飞冲天”之上。

    一九零九年圣诞节的前夕,他终于把自己的最后一些冬服典当一空,失魂落魄地进入了麦德林的一个流浪者收容所。这家收容所是由当时的一个社会福利组织资助主办的,其主要支持者是一个姓埃泼斯坦的犹太人家庭。与当时其他的收容所相比,这是一个时新、清洁、慷慨的地方。然而,不论何人,一俟在这里落迹,便会被社会和自我意识判定为失败者并滑到了市民阶层中最低贱的地位。希特勒当时正是处于这样一种身心状况。他无力适应这个社会里的倾轧排挤,但他很快便遇到了一位当时作佣人的名叫赖因霍尔德.哈尼施的人。哈尼施感到十分困惑不解的是,一个具有如此才华的年轻人怎么会随随便便地听任命运的摆布。哈尼施给希特勒指点了度过危机的办法,动员他以维也纳市容为蓝本去画明信片,再由自己拿到街上去出售,最后把赚得的钱与希特勒平分。

    后来,哈尼施终于鼓动希特勒迁出了流浪者收容所,搬进了一所单身汉公寓。希特勒于一九一零年二月九日搬入的这所单身汉公寓是维也纳第二十区的一个新型建筑。该区当时是一个工业区,居住着许多不同的民族,除了利奥波德以外,这里犹太人的比例超过了维也纳其他任何一个区。这所单身汉公寓是一个设有餐厅、大起居室、洗澡间和单人房间的现代化住宅,以致当时规矩守旧的维也纳市民们都对这所“奢侈的住宅”评头品足,感到不平。希特勒在这里住上了一个小小的单元,租金每天半个克朗。他天天如此,坐在他那所谓的书房中画他的明信片。这些明信片的销路竟然十分理想,于是,精通生意经的哈尼施不久又鼓动希特勒转画较大型的水彩画,然后由他带到游艺场的酒厅中去兜售。

    希特勒的绘画作品头一眼看上去很象是拍摄的照片。他并没有受过专门训练,但却在一定程度上掌握了对建筑物进行准确临摹的技巧。然而,他却缺乏艺术修养并且丝毫不具备刻画人物的才能。由于有了与冶尼施平分共享的这笔靠着作画所赚得的钱,再加上他继续领取的孤儿抚养费:希特勒过上了一种食宿无虑的生活。
  20. May28
    单身汉公寓里的政论俱乐部



    没过多长时间,希特勒就把单身汉公寓里的阅览室变成了一个政论俱乐部。那里聚集着房客中间的“上流人士”和市民阶层中的失意者,也有少量的工人在“举止正派万的前提下被允许接纳进这个俱乐部。希特勒在此处夸夸其谈,大吹牛皮。

    就在这所单身汉公寓旦,通过与那些不得志的小市民们永无休止的辩论,并且正如希特勒后来在《我的奋斗》一书中所说的那样,在一刻也未与工人在劳动中接触过的情况之下,希特勒开始形成了他的世界观。他按其所需,热忱地维护一切他所赞同的社会口号和政治口号,激烈地抨击其他那些应该对他的失败负责的社会口号和政治口号,重新树立起自己内心深处市民阶层的优越感,同时以此对自己周围纷乱复杂的社会现象进行着简洁的解释。

    希特勒曾经在《我的奋斗》一书中谈到过他在维也纳的“学习时期”,他写道:“我把做完工剩下的全部时间分秒必争地投入了我的学习。正因为这样,我在短短的几年当中打下了知识基础,这些一直到今天还在使我继续受益。在这段时期里,我逐渐形成了对世界的认识,树立起了一种世界观,它们变成了我今天行动的坚实基础。后来,对早年所打下的这个坚实基础。我自然必须做些细小的补充学习,但却根本谈不上需要再做任何变动。”然而,与希特勒的这些说法恰恰相反,事实上他既没有做过工,也没有进行过系统的自学,甚至没有认真地、有条有理地读过书。形成他的世界观的源泉主要是那些流传于民间的小册子,它们大肆鼓吹的是一种极端的国家主义和极端的种族主义。

    希特勒当时经常阅读的是一种叫作《东方天坛星》的杂志。杂志的创办者是一位名叫阿道夫·兰兹的修道士。他自称为兰兹·冯①·利本弗尔斯,并在下奥地利韦尔芬斯坦他的所谓“贵族领地”里,扯起了一面动的标语。《东方天坛星》杂志中充斥着神学、色情和种族主义的大杂烩,其宗旨是创造一种金发蓝眼的雅利安优秀人种,而这个优秀人种的任务则是反对那些“劣等的杂交人种”,首先是反对犹太人那种“堕落不堪”的影响。

    ①冯在当时的德文姓氏中表示贵族出身。——译者注。



    然而,《东方天坛星》本身仅仅代表了种族观念和排犹思潮所具有的那样一种充满着自相矛盾的变态意识。这种反犹主义在当时的全体市民中间悄悄地蔓延着,以致于任何一位狡猾的煽动家都能够在危机到来时趁机鼓动风潮,使这种反犹主义得以风靡一时。

    当时,格奥尔格·冯·舍纳领导的反犹主义运动,正是在德意志民族主义和反犹主义的口号下,反对哈布斯堡王朝这个多民族的国家的。维也纳市当时的市长卡尔,吕格尔也试图通过反犹宣传和挑动起德意志民族意识,把维也纳的小市民阶层和社会主义者中间的工人群众吸引到他那个天主教社会党一边来。希特勒对舍纳和吕格尔佩服得五体投地,并且在他们的宣传中找到了自己仇视犹太人、市民社会和社会主义的理论根据,后来又把它们运用到他的那个“国家社会主义”之中。

    希特勒所描述的他在维也纳学习时期的收获以及形成他后来行动所依据的那个 “坚实基础”,总结起来,可以被看作是一种战斗宣言,它反对宽容和全世界各族人民一律平等的世界观,反对民主和议会制度,反对马克思主义和犹太人集团,反对社会平等和政治自由。其中的核心和他一生始终不渝的“真正信仰”从当时来看,主要是他的反犹主义。

    希特勒变成了一个种族狂。他笃信“雅利安种族”天生就是高贵的,是真善美的;而“犹太种族”则恰恰相反,他们是低贱的,是假恶丑的。他试图用这样一种黑白颠倒的荒谬公式来解释整个世界历史和当代政治。同时,当时失意潦倒的阿道夫·希特勒也作为“雅利安人”和“德意志人”而找回了一种凌驾于哈布斯堡王朝中犹太臣民及斯拉夫臣民之上的优越感和对自身“伟大价值”的认识。



    逃往慕尼黑



    一九一三年五月,希特勒突然离开了单身汉公寓和维也纳,迁居到德国的慕尼黑。关于他此次迁居的真实动机至今还是个谜。希特勒在《我的奋斗》一书中回避了这一事件。

    那一年的四月,希特勒已年满二十四岁,从此永远失去了他的孤儿抚养金。有人曾列举了一些事实猜测说,希特勒遁往国外的动机是想逃避在奥地利服兵役。

    他厌恶哈布斯堡王朝的这个多民族国家,因而不打算在它的军队中服役。至于对战争和德国军队,他却压根儿就不反对,这一点后来在一九一四年八月中体现得一清二楚。

    一九一四年一月十八日,希特勒在慕尼黑突然接到了巴伐利亚警察局的传票,勒令他于一月二十日以前回林茨的征兵体检局去报到,否则从法律追究的角度,他将被判处一年的有期徒刑。接传票后,希特勒立即前往奥地利驻慕尼黑的总领事馆求援,并且给林茨的征兵体检局写了一封诉苦陈情、极其哀怜的信,信中写道: “两年以来,忧愁和贫困是我的女友①,无尽的饥馑是我的同伴②。我从未在实际生活中结识过青春这样一个美丽的字眼。直到五年后的今天,满手满脚的冻疮仍是那悲惨时日留给我的纪念。”这封信中的哀情切语和悲怆陈辞产生了效果,林茨当局同意他在萨尔茨堡的补充兵体检局进行一次体格检查。一九一四年二月五日所得出的体检结论是:“不适合执行战斗部队和后勤部队的各种勤务,体质太弱,不合格。”用这张体检证明,希特勒终于逃过了奥地利兵营中的新兵训练。

    在慕尼黑,希特勒象在维也纳那样重操旧业,画好城市风光画片,或走街串巷,或在酒馆里兜售,用赚来的钱维持生计。冬天,买卖很不景气,但他还是挣扎着挺了过来。当时,他居住在史莱斯亥姆大街的一家名叫波普的裁缝匠家中。

    波晋的妻子认为当时的希特勒是“一个说起话来妙趣横生,见义勇为,十分可爱的奥地利青年”。

    但是,他却显得有几分神秘,成天总是象—个隐士似地杜门谢客,一头扎进他从图书馆呈借回的那摞厚厚的书堆中。据希特勒后来自己回忆说,他在这段时间里集中精力研究了马克思主义,这是一门“摧毁的学说”。然而,希特勒给人的印象始终却是:他对世界的看法早巳经是根深蒂固,他之所以还要读书,无非是想证明一下他的那种先人为主的见解罢了。希特勒十分重视树立起一种具有坚不可摧基础的、始终如一的世界观;而对于一种锲而不舍、终生探求式的学习,对于一种随着知识和阅历的不断增长而去不断更新自己见解的作法,希特勒只能是报以轻蔑、嗤之以鼻的一笑。
    ①女友、忧愁和贫困在德语中都是阴性名词。这里使用的是一种文学中的拟人化手法。——译者注。
    ②同伴和饥馑都系阳性名词,所袭手法同上。——译者注
  21. May28
    第一次世界大战中的传令兵



    一九一四年六月八日,奥匈帝国的皇太子、弗兰茨·斐迪南大公在萨拉热窝被塞尔维亚的民族主义分子刺杀。事件的发生加剧了国际紧张空气,德意志帝国支持哈布斯堡王朝反对塞尔维亚国和俄罗斯帝国。公历八月一日,德皇签署了对俄作战的总动员令。

    对俄开战的消息传到了慕尼黑,统帅府大厦前举行了庆祝大会,对此表示热烈欢迎。希特勒本人当时参加了这次庆祝大会。他在喀我的奋斗》“八月的经历”一章中这样写道:“当时的那种时刻对我本人来说简直就象是一种奇迹,把我青年时代的怨愤一扫而光。时至今日,我也仍然无可讳言,当时的我完全被一种异乎寻常的冲动感情支配着,双膝跪地,衷心地感谢上苍有眼,感谢它使我有幸生活在这样一个时代。”八月三日,德意志帝国对法国宣战。希特勒立即上书给巴伐利亚国王路德维希三世,恳求国王能够准许他加入巴伐利亚军队,八月四日,他获准作为志愿兵加入了巴伐利亚步兵第一团。

    加入军队对希特勒来说,首先是使两个迫在眉睫的难题一下子变得烟消云散、化为乌有了。他用不着再担心加入他所讨厌的奥匈帝国的军队,也不必再发愁没有固定的收入而去苦熬寒冬了。他在军队中找到了住所和膳食,但是,更为重要的还是找到了一个奋斗目标。一身戎装使他不必再为生活无计而担惊受怕,现在,他唯一所担心的是在他还没有捞上打仗之前战争就结束了。

    他首先结束了队列、射击和刺杀的基础科目训练,于十月二十日随军向比利时开拔。一周以后,希特勒所在的连队奉命投入了争夺伊普雷的战斗。战斗连续进行了三天三夜,希特勒所在的步兵团蒙受了重大的损失,但攻占伊普雷的计划却并没有实现。不久,德国结束了在比利时的攻势作战,代之而来的是堑壕战的开始。为了奖励他在敌人面前所表现出的那种英勇无畏的战斗精神,希特勒此时被授予一枚二级铁十字奖章,并且被擢升为陆军下士。

    希特勒当时是传令兵,他必须把团指挥部的命令和报告送往其他指挥机关和战斗部队。因此,他经常出没在前沿阵地上,并且必须不断地冒着生命危险去开辟自己的道路。尽管有此种危险,或者可以讲,正是因为有了此种危险,执行任务才使希特勒倍受鼓舞,以致他经常自告奋勇地代替其他的传令兵去传递信件。

    曾经数次,他仅仅是凭着侥幸才逃脱了死神的召唤。渐渐地,他却因此而产生了一种信念,即“我将肩负天下大任”。

    “我尚未鸣,只是在等待着,直到我的时辰降临" ,他的这些惊人之语曾经使他的战友们目瞪口呆、不知所措。希特勒曾反复声称,他的家就是现在的第十六团,此外则别无归所。在战争中,在军队的命令主义和等级森严的天地中,希特勒终于找到了他所需要的秩序。他象许多当时上过火线的士兵们一样,在战后为失去了战争中的秩序和火线生活而痛惜不止,并企图有朝一日动手恢复这所有的一切。后来的德国国家主义工人党及其军队冲锋队和党卫军以及日后第三帝国中各种组织的建立都无不体现了这样的一种恢复。

    尽管希特勒表观得不同凡响,不象其他士兵们那样想度过战争,重返家园,但他却仍然受到了周围战友们的敬重。

    由于他能够大段地朗读叔本华①的著作并能滔滔不绝地谈论文学、艺术和政治,因此被公认为是一个知识分子。此外,他还表现得任劳任怨、忠实可信和见义勇为。他常常不厌其烦地宣传吸烟和酗酒的害处,这一点甚至引起了同伴们的讨厌。但他自己也并不是一个清心寡欲的苦行主义者,因为他永无休止地感到饥饿,战友们给他封了个“饕餮”的绰号。

    假如专门研究希特勒的历史学家维尔纳·马泽尔的考证合乎实际情况的话,希特勒在这段时间里曾经与一个法国的农家女发生过性关系并留下了一个儿子。
    ①叔本华(Arthur SchoPenhauer,1788—1860)德国唯心主义哲学家,唯意志论者,主要著作有《世界即意志和观念》,在历史、文艺理论和心理学等方面都有研究,第三帝国时期很受推崇。——译者注。



    作为一个传令兵,他干得的确很出色,但希特勒在整个战争期间的军阶一直是个陆军下士。他之所以没能得到提升,是因为上级认为他不适合去指挥部队。另外一个原因是他的军人姿态不十分端正,他总是歪斜着脑袋,行军时把脚拖在地面上,发出啪嗒——啪嗒的声响,擦靴子时敷衍了事,在军官面前立正的时候后脚跟也总是碰不到一条线上。最后一个原因是,当时的传令兵没有陆军中士军阶,假如希特勒一旦被提升,他就必须放弃自己所心爱的工作,而这样一来,团旦也必将失掉它的一名最出色的传令兵。

    一场旷日持久、令人疲惫不堪的堑壕战打过之后,一九一六年的初夏,前线又重新开始了一次新的作战行动。夏季战役打得天昏地暗,希特勒那个团开治向南推进。一九一六年十月七日那天,希特勒和另外几个传令兵正在一条战壕中睡觉,一颗炮弹正好飞进了战壕,并在那里爆炸。希特勒的大腿受了伤,被人抬下了阵地,不久匣被送进了座落在柏林南面的一家野战医院。两个月以后,他复元出院,被派往驻扎在慕尼黑的一个补充营。慕尼黑和补充营的气氛使希特勒十分反感,城市里居民们的耐力已经到了崩溃的临界点,他到处看到的是“犹太煽动分子”在活动。一直到了一九一七年一月他重新返回到他那潮湿的战壕中的时候,他的心情才算平静下来。


    “我终于决定——当一个政治家”



    一九一八年三月三日,德意志帝国当局迫使布尔什维克俄国在布列斯特——利托夫斯克立约,实行了一种“强制和平”,条约保证了德匡对东欧的永久性统治权力。战争至此似乎朝着有利于德国的方向发生了转折。春季,西线出观了新的转机,德国开始了决定性的攻势。兴登堡的助手、德军统帅鲁登道夫将军决定孤注一掷。假如攻势奏效,德国便可赢得战争;一旦失败,德国便将一败涂地。

    希特勒在这一阶段的作战中仍然是激情未减。一九一八年六月,他俘获了四名法国士兵,荣获了一枚一级铁十字奖章。然而,此时的战争态势业已明朗,鲁登道夫大肆鼓吹的那个攻势已经濒于山穷水尽的境地。此种在东方告捷但却在西方惨败的状况产生了灾难性的后果。部队和军官们的土气江河日下,士兵们纷纷开了小差。不少试图保持秩序的军官在石块和手榴弹下死于非命,革命的标语也被人用浆糊贴在军用列车的车厢上,标语写道:“我们不是在为德国的荣誉而战,而是在为百万富翁们流血!”

    八月中旬,协约国的军队在亚眠①突破了德军防线,战争打败了。协约国最高军事当局命令德帝国立即放下武器,开始和平谈判。当帝国的新任总理马克斯·冯· 巴登亲王向美国总统威尔逊请求停战的消息不胫而走之时,许多德国人都感觉到突然和震惊,因为先前灌满他们双耳的都是胜利的战报。不少前线的军人也认为,这是那些“文职胆小鬼们”

    背叛了祖国的神圣大业。他们根本无法知道,正是兴登堡和鲁登道夫本人在逼迫着帝国的文职政府去乞求停战。当最早的革命浪潮在德国沸腾时,象希特勒一样的那批国家主义者们立即断定,这是一伙“社会民主派的家伙们”在煽动革命,目的是要从战无不胜的帝国陆军的背后捅上一刀。在此种背景之下,一种“暗箭伤人” 的神话应运而生,它是经过精心策划之后而从军队最高当局中散布出来的,其目的是为了掩盖军事上的失败,并将战败的责任嫁祸于“红色分子”。

    但是,革命的真正原因在于人们对战争业已普遍痛感厌倦,并且对德意志帝国政府的战争政策深为不满。

    ①法国北部城市,第一次世界大战期间德军曾在此处设立最后一道西部防线。 ——译者注。



    时隔不久,舰队水兵进行的哗变直接引起了一场革命。

    革命运动的火焰越烧越旺,很快就从沿海城市蔓延到了整个德国。国内到处都成立了工人委员会和士兵委员会,除了那些无党派的士兵以外,参加委员会的主要是各种社会主义团体的成员们,其中有弗里德里希·埃伯特领导的多数社会民主党人,胡戈·哈塞领导的独立社会民主党人以及罗莎.卢森堡与卡尔·李卜克内西领导的斯巴达克团。

    一九一八年十一月七日,巴伐利亚国王退位。十一月九日,多数社会民主党人菲利普·谢德曼①在卡尔·李卜克内西宣布成立“社会主义共和国”之前,抢先宣布成立了“德意志共和国”。威廉二世皇帝逃往荷兰。十一月十日,由多数社会民主党和独立社会民主党各出三名代表组成了一个临时政府,称之为“人民代表委员会”。临时政府的实际首脑是弗里德里希。埃伯特。十一月十一日,一支由中央党议员马蒂亚斯·埃兹贝格率领的德国代表团在贡比涅与协约国签立了停战协定。德皇和他的将军们打输了这场战争,然而这一失败却必须由新生的共和国予以承认。就在这样的时期,有一个词从天而降,这便是“十一月罪人”。如此一来,从罗莎· 卢森堡一直到弗里德里希·埃伯特的社会党人、自由党人和天主教中央党的领导人都变成了卑鄙的人物。

    ①菲利普。谢德曼(Philipp Scllc5 demann)现译为非利普·沙伊搏曼。
    为了便于读者阅读,本书仍沿用旧译。——译者注。



    希特勒是在野战医院中得悉这一革命的全部经过的。他所属的那个团曾于九月份被派往弗兰德,第三次向伊普雷挺进。十月十四日,希特勒在英国人的毒气战中双目暂时失明,被送进新勃兰登堡帕泽瓦尔克镇的一家野战医院,在那里经过数周治疗后才得以重见光明。当他初闻停战协定签立的消息时,顿觉整个世界已经不复存在。他后来写道:“我简直是一刻也坚持不了了。我感到天昏地暗,眼前又重新变得漆黑一团,我摸索着,踉跄着,跌跌撞撞地回到了寝室,一头扑到行军床上,把疼痛欲裂的脑袋埋在了被子和枕头下面。”大概就是在这一天的夜间,他原先那种是当建筑师呢还是当政治家的犹豫结束了。他在《我的奋斗》一书中激昂而又简练地写道:“我终于决定——当一个政治家。”
×
×
  • 创建新的...