00001 /* 00002 * quaternion.cpp 00003 * 00004 * Copyright (C) 2009 Thomas A. Vaughan 00005 * All rights reserved. 00006 * 00007 * 00008 * Redistribution and use in source and binary forms, with or without 00009 * modification, are permitted provided that the following conditions are met: 00010 * * Redistributions of source code must retain the above copyright 00011 * notice, this list of conditions and the following disclaimer. 00012 * * Redistributions in binary form must reproduce the above copyright 00013 * notice, this list of conditions and the following disclaimer in the 00014 * documentation and/or other materials provided with the distribution. 00015 * * Neither the name of the <organization> nor the 00016 * names of its contributors may be used to endorse or promote products 00017 * derived from this software without specific prior written permission. 00018 * 00019 * THIS SOFTWARE IS PROVIDED BY THOMAS A. VAUGHAN ''AS IS'' AND ANY 00020 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 00021 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00022 * DISCLAIMED. IN NO EVENT SHALL THOMAS A. VAUGHAN BE LIABLE FOR ANY 00023 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 00024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 00026 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00028 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00029 * 00030 * 00031 * Implementation of quaternion methods. See quaternion.h 00032 */ 00033 00034 // includes -------------------------------------------------------------------- 00035 #include "quaternion.h" // always include our own header first 00036 00037 #include <math.h> 00038 00039 00040 00041 //////////////////////////////////////////////////////////////////////////////// 00042 // 00043 // static helper methods 00044 // 00045 //////////////////////////////////////////////////////////////////////////////// 00046 00047 00048 //////////////////////////////////////////////////////////////////////////////// 00049 // 00050 // public API 00051 // 00052 //////////////////////////////////////////////////////////////////////////////// 00053 00054 void 00055 quaternion_t::setEulerZYX 00056 ( 00057 IN float yaw, 00058 IN float pitch, 00059 IN float roll 00060 ) 00061 throw() 00062 { 00063 // create quaternion based on Euler ZYX values 00064 // see bullet physics code or search online for examples 00065 float hY = 0.5 * yaw; // hY: "half Yaw" 00066 float hP = 0.5 * pitch; // hP: "half Pitch" 00067 float hR = 0.5 * roll; // ... 00068 00069 float cY = cos(hY); // cY: cosine of half Yaw 00070 float sY = sin(hY); // sY: sine of half Yaw 00071 float cP = cos(hP); // ... 00072 float sP = sin(hP); 00073 float cR = cos(hR); 00074 float sR = sin(hR); 00075 00076 // go ahead and set quaternion values based on trig results above 00077 x = sR * cP * cY - cR * sP * sY; 00078 y = cR * sP * cY + sR * cP * sY; 00079 z = cR * cP * sY - sR * sP * cY; 00080 w = cR * cP * cY + sR * sP * sY; 00081 } 00082