//============================================================ public void LookAt(float x, float y, float z) { _target.Set(x, y, z); _direction.X = x - _position.X; _direction.Y = y - _position.Y; _direction.Z = z - _position.Z; _direction.Normalize(); Update(); }
//============================================================ public float ToFloat() { _direction.Normalize(); float x = (_direction.X + 1.0f) * 0.5f * 255.0f; float y = (_direction.Y + 1.0f) * 0.5f * 255.0f; float z = (_direction.Z + 1.0f) * 0.5f * 255.0f; return((x * 256.0f * 256.0f) + (y * 256.0f) + (z)); }
//============================================================ // <T>向左/向右旋转</T> // // @param angle 角度 //============================================================ public void DoYaw(float angle) { SFloatVector3 direction = new SFloatVector3(); // 旋转Y轴 SDxMatrix matrix = new SDxMatrix(); matrix.ry = angle; matrix.UpdateForce(); matrix.Transform3x3Vector3(direction, _direction); // 旋转方向 direction.Normalize(); _direction.Assign(direction); UpdateTarget(); }
//============================================================ // <T>加载配置信息。</T> // // @param xconfig 配置信息 //============================================================ public void LoadConfig(FXmlNode xconfig) { // 读取属性 _typeName = xconfig.Get("type_name"); // 读取节点集合 foreach (FXmlNode xnode in xconfig.Nodes) { // 读取中心 if (xnode.IsName("Center")) { _centerFront = xnode.GetFloat("front"); _centerBack = xnode.GetFloat("back"); } // 读取位置 if (xnode.IsName("Position")) { _position.LoadConfig(xnode); } // 读取方向 if (xnode.IsName("Direction")) { _direction.LoadConfig(xnode); } // 读取目标 if (xnode.IsName("Target")) { SFloatPoint3 target = new SFloatPoint3(); target.LoadConfig(xnode); _direction.X = target.X - _position.X; _direction.Y = target.Y - _position.Y; _direction.Z = target.Z - _position.Z; _direction.Normalize(); } // 读取焦平面 if (xnode.IsName("Focal")) { _focalNear = xnode.GetFloat("near"); _focalFar = xnode.GetFloat("far"); } // 读取视角 if (xnode.IsName("Viewport")) { _viewport.LoadConfig(xnode); } } }
//============================================================ // <T>向上/向下旋转</T> // // @param angle 角度 //============================================================ public void DoPitch(float angle) { SFloatVector3 axis = new SFloatVector3(); SFloatVector3 axisUp = new SFloatVector3(0, 1, 0); axisUp.Cross(_direction, axis); DxMatrix dxMatrix = DxMatrix.RotationAxis(new Vector3(axis.X, axis.Y, axis.Z), angle); SFloatVector3 direction = new SFloatVector3(); // 旋转Y轴 SDxMatrix matrix = new SDxMatrix(); matrix.AssignNative(dxMatrix); matrix.UpdateData(); matrix.Transform3x3Vector3(direction, _direction); // 旋转方向 direction.Normalize(); _direction.Assign(direction); UpdateTarget(); }
//============================================================ public void RangeIncise() { FCompressFile file = new FCompressFile(); int height = _size.Height; int width = _size.Width; for (int y = 0; y <= height; y++) { for (int x = 0; x <= width; x++) { //............................................................ // 计算坐标位置 int positionX = x; if (positionX >= _size.Width) { positionX = _size.Width - 1; } int positionY = y; if (positionY >= _size.Height) { positionY = _size.Height - 1; } int positionHeight = 2 * (_size.Width * positionY + positionX); float h = _heightData[positionHeight] + _heightData[positionHeight + 1] * 256; // 计算点高度(1, 0) SFloatVector3 tangent = new SFloatVector3(1, 0, 0); if (positionX < _size.Width - 1) { int tangentPosition = 2 * (_size.Width * positionY + (positionX) + 1); float h1 = _heightData[tangentPosition] + _heightData[tangentPosition + 1] * 256; float dx = (h1 - h) / 65535 * _deep; tangent.Set(1, dx, 0); } tangent.Normalize(); // 计算点高度(0, 1) SFloatVector3 binormal = new SFloatVector3(0, 0, 1); if (positionY < _size.Height - 1) { int binormalPosition = 2 * (_size.Width * (positionY + 1) + positionX); float h2 = _heightData[binormalPosition] + _heightData[binormalPosition + 1] * 256; float dy = (h2 - h) / 65535 * _deep; binormal.Set(0, dy, 1); } binormal.Normalize(); // 计算法线 SFloatVector3 normal = new SFloatVector3(); binormal.Cross(tangent, normal); normal.Normalize(); //............................................................ // 输出像素的高度 file.WriteUint8(_heightData[positionHeight]); file.WriteUint8(_heightData[positionHeight + 1]); // 输出像素的颜色 Color color = _colorData.Bitmap.GetPixel(positionX, positionY); file.WriteUint8(color.R); file.WriteUint8(color.G); file.WriteUint8(color.B); // 输出像素的法线 file.WriteUint8((byte)((normal.X + 1) * 0.5 * 255)); file.WriteUint8((byte)((normal.Y + 1) * 0.5 * 255)); file.WriteUint8((byte)((normal.Z + 1) * 0.5 * 255)); // 输出像素的层数据 for (int n = 0; n < _layerCount; n++) { FBitmap layerData = _layers[n].Bitmap; Color layerColor = layerData.Bitmap.GetPixel(positionX, positionY); file.WriteUint8(layerColor.R); } x += 8; } y += 8; } /*string rangeFile = "tile_" + RInt.Pad(x, 2) + "_" + RInt.Pad(cy, 2) + ".swf"; */ }
//============================================================ // <T>序列化数据。</T> //============================================================ public void ExportRange(int cx, int cy) { FCompressFile file = new FCompressFile(); // 存储编号 file.WriteUint32((uint)_id); // 存储层数 file.WriteUint16((ushort)_layerCount); // 当前地图的宽度和高度 file.WriteUint16((ushort)_size.Width); file.WriteUint16((ushort)_size.Height); // 当前范围的宽度和高度 file.WriteUint16((ushort)_range.Width); file.WriteUint16((ushort)_range.Height); file.WriteFloat(_deep); // 当前范围的位置坐标 file.WriteUint16((ushort)cx); file.WriteUint16((ushort)cy); // 计算开始坐标 int offsetX = _range.Width * cx; int offsetY = _range.Height * cy; // 输出数据 int width = _range.Width; int height = _range.Height; for (int y = 0; y <= height; y++) { for (int x = 0; x <= width; x++) { //............................................................ // 计算坐标位置 int positionX = offsetX + x; if (positionX >= _size.Width) { positionX = _size.Width - 1; } int positionY = _size.Height - (offsetY + y) - 1; if (positionY < 0) { positionY = 0; } else if (positionY >= _size.Height) { positionY = _size.Height - 1; } int positionHeight = 2 * (_size.Width * positionY + positionX); float h = _heightData[positionHeight] + _heightData[positionHeight + 1] * 256; // 计算点高度(1, 0) SFloatVector3 tangent = new SFloatVector3(1, 0, 0); if (positionX < _size.Width - 1) { int tangentPosition = 2 * (_size.Width * positionY + (positionX) + 1); float h1 = _heightData[tangentPosition] + _heightData[tangentPosition + 1] * 256; float dx = (h1 - h) / 65535 * _deep; tangent.Set(1, dx, 0); } tangent.Normalize(); // 计算点高度(0, 1) SFloatVector3 binormal = new SFloatVector3(0, 0, 1); if (positionY < _size.Height - 1) { int binormalPosition = 2 * (_size.Width * (positionY + 1) + positionX); float h2 = _heightData[binormalPosition] + _heightData[binormalPosition + 1] * 256; float dy = (h2 - h) / 65535 * _deep; binormal.Set(0, dy, 1); } binormal.Normalize(); // 计算法线 SFloatVector3 normal = new SFloatVector3(); binormal.Cross(tangent, normal); normal.Normalize(); //............................................................ // 输出像素的高度 file.WriteUint8(_heightData[positionHeight]); file.WriteUint8(_heightData[positionHeight + 1]); // 输出像素的颜色 Color color = _colorData.Bitmap.GetPixel(positionX, positionY); file.WriteUint8(color.R); file.WriteUint8(color.G); file.WriteUint8(color.B); // 输出像素的法线 file.WriteUint8((byte)((normal.X + 1) * 0.5 * 255)); file.WriteUint8((byte)((normal.Y + 1) * 0.5 * 255)); file.WriteUint8((byte)((normal.Z + 1) * 0.5 * 255)); // 输出像素的层数据 for (int n = 0; n < _layerCount; n++) { FBitmap layerData = _layers[n].Bitmap; Color layerColor = layerData.Bitmap.GetPixel(positionX, positionY); file.WriteUint8(layerColor.R); } } } // 输出文件 string rangeFile = "tile_" + RInt.Pad(cx, 2) + "_" + RInt.Pad(cy, 2) + ".swf"; file.SaveFile(_exportFilePath + "\\" + rangeFile); }