📄 imfenvmap.h
字号:
/////////////////////////////////////////////////////////////////////////////// Copyright (c) 2004, Industrial Light & Magic, a division of Lucas// Digital Ltd. LLC// // All rights reserved.// // Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions are// met:// * Redistributions of source code must retain the above copyright// notice, this list of conditions and the following disclaimer.// * Redistributions in binary form must reproduce the above// copyright notice, this list of conditions and the following disclaimer// in the documentation and/or other materials provided with the// distribution.// * Neither the name of Industrial Light & Magic nor the names of// its contributors may be used to endorse or promote products derived// from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE./////////////////////////////////////////////////////////////////////////////#ifndef INCLUDED_IMF_ENVMAP_H#define INCLUDED_IMF_ENVMAP_H//-----------------------------------------------------------------------------//// Environment maps//// Environment maps define a mapping from 3D directions to 2D// pixel space locations. Environment maps are typically used// in 3D rendering, for effects such as quickly approximating// how shiny surfaces reflect their environment.//// Environment maps can be stored in scanline-based or in tiled// OpenEXR files. The fact that an image is an environment map// is indicated by the presence of an EnvmapAttribute whose name// is "envmap". (Convenience functions to access this attribute// are defined in header file ImfStandardAttributes.h.)// The attribute's value defines the mapping from 3D directions// to 2D pixel space locations.//// This header file defines the set of possible EnvmapAttribute// values.//// For each possible EnvmapAttribute value, this header file also// defines a set of convienience functions to convert between 3D// directions and 2D pixel locations.//// Most of the convenience functions defined below require a// dataWindow parameter. For scanline-based images, and for// tiled images with level mode ONE_LEVEL, the dataWindow// parameter should be set to the image's data window, as// defined in the image header. For tiled images with level// mode MIPMAP_LEVELS or RIPMAP_LEVELS, the data window of the// image level that is being accessed should be used instead.// (See the dataWindowForLevel() methods in ImfTiledInputFile.h// and ImfTiledOutputFile.h.)////-----------------------------------------------------------------------------#include "ImathBox.h"namespace Imf {//--------------------------------// Supported environment map types//--------------------------------enum Envmap{ ENVMAP_LATLONG = 0, // Latitude-longitude environment map ENVMAP_CUBE = 1, // Cube map NUM_ENVMAPTYPES // Number of different environment map types};//-------------------------------------------------------------------------// Latitude-Longitude Map://// The environment is projected onto the image using polar coordinates// (latitude and longitude). A pixel's x coordinate corresponds to// its longitude, and the y coordinate corresponds to its latitude.// Pixel (dataWindow.min.x, dataWindow.min.y) has latitude +pi/2 and// longitude +pi; pixel (dataWindow.max.x, dataWindow.max.y) has// latitude -pi/2 and longitude -pi.//// In 3D space, latitudes -pi/2 and +pi/2 correspond to the negative and// positive y direction. Latitude 0, longitude 0 points into positive// z direction; and latitude 0, longitude pi/2 points into positive x// direction.//// The size of the data window should be 2*N by N pixels (width by height),// where N can be any integer greater than 0.//-------------------------------------------------------------------------namespace LatLongMap{ //---------------------------------------------------- // Convert a 3D direction to a 2D vector whose x and y // components represent the corresponding latitude // and longitude. //---------------------------------------------------- Imath::V2f latLong (const Imath::V3f &direction); //-------------------------------------------------------- // Convert the position of a pixel to a 2D vector whose // x and y components represent the corresponding latitude // and longitude. //-------------------------------------------------------- Imath::V2f latLong (const Imath::Box2i &dataWindow, const Imath::V2f &pixelPosition); //------------------------------------------------------------- // Convert a 2D vector, whose x and y components represent // longitude and latitude, into a corresponding pixel position. //------------------------------------------------------------- Imath::V2f pixelPosition (const Imath::Box2i &dataWindow, const Imath::V2f &latLong); //----------------------------------------------------- // Convert a 3D direction vector into a corresponding // pixel position. pixelPosition(dw,dir) is equivalent // to pixelPosition(dw,latLong(dw,dir)). //----------------------------------------------------- Imath::V2f pixelPosition (const Imath::Box2i &dataWindow, const Imath::V3f &direction); //-------------------------------------------------------- // Convert the position of a pixel in a latitude-longitude // map into a corresponding 3D direction. //-------------------------------------------------------- Imath::V3f direction (const Imath::Box2i &dataWindow, const Imath::V2f &pixelPosition);}//--------------------------------------------------------------// Cube Map://// The environment is projected onto the six faces of an// axis-aligned cube. The cube's faces are then arranged// in a 2D image as shown below.//// 2-----------3// / /|// / / | Y// / / | |// 6-----------7 | |// | | | |// | | | |// | 0 | 1 *------- X// | | / /// | | / /// | |/ /// 4-----------5 Z// // dataWindow.min// /// / // +-----------+// |3 Y 7|// | | |// | | |// | ---+---Z | +X face// | | |// | | |// |1 5|// +-----------+// |6 Y 2|// | | |// | | |// | Z---+--- | -X face// | | |// | | |// |4 0|// +-----------+// |6 Z 7|// | | |// | | |// | ---+---X | +Y face// | | |// | | |// |2 3|// +-----------+// |0 1|// | | |// | | |// | ---+---X | -Y face// | | |// | | |// |4 Z 5|// +-----------+// |7 Y 6|// | | |// | | |// | X---+--- | +Z face// | | |// | | |// |5 4|// +-----------+// |2 Y 3|// | | |// | | |// | ---+---X | -Z face// | | |// | | |// |0 1|// +-----------+// /// /// dataWindow.max//// The size of the data window should be N by 6*N pixels// (width by height), where N can be any integer greater// than 0.// //--------------------------------------------------------------//------------------------------------// Names for the six faces of the cube//------------------------------------enum CubeMapFace{ CUBEFACE_POS_X, // +X face CUBEFACE_NEG_X, // -X face CUBEFACE_POS_Y, // +Y face CUBEFACE_NEG_Y, // -Y face CUBEFACE_POS_Z, // +Z face CUBEFACE_NEG_Z // -Z face};namespace CubeMap{ //--------------------------------------------- // Width and height of a cube's face, in pixels //--------------------------------------------- int sizeOfFace (const Imath::Box2i &dataWindow); //------------------------------------------ // Compute the region in the environment map // that is covered by the specified face. //------------------------------------------ Imath::Box2i dataWindowForFace (CubeMapFace face, const Imath::Box2i &dataWindow); //---------------------------------------------------- // Convert the coordinates of a pixel within a face // [in the range from (0,0) to (s-1,s-1), where // s == sizeOfFace(dataWindow)] to pixel coordinates // in the environment map. //---------------------------------------------------- Imath::V2f pixelPosition (CubeMapFace face, const Imath::Box2i &dataWindow, Imath::V2f positionInFace); //-------------------------------------------------------------- // Convert a 3D direction into a cube face, and a pixel position // within that face. // // If you have a 3D direction, dir, the following code fragment // finds the position, pos, of the corresponding pixel in an // environment map with data window dw: // // CubeMapFace f; // V2f pif, pos; // // faceAndPixelPosition (dir, dw, f, pif); // pos = pixelPosition (f, dw, pif); // //-------------------------------------------------------------- void faceAndPixelPosition (const Imath::V3f &direction, const Imath::Box2i &dataWindow, CubeMapFace &face, Imath::V2f &positionInFace); // -------------------------------------------------------- // Given a cube face and a pixel position within that face, // compute the corresponding 3D direction. // -------------------------------------------------------- Imath::V3f direction (CubeMapFace face, const Imath::Box2i &dataWindow, const Imath::V2f &positionInFace);}} // namespace Imf#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -