//触屏事件处理 void HelloWorld::onTouchesBegan(const std::vector<Touch*>& touches, Event *unused_event) { //屏幕转换到射线 kmVec3 tPt; kmVec3 tDir; // 获取点在视图中的坐标 CCPoint touchLocation = touches[0]->getLocation(); auto visibleSize = Director::getInstance()->getVisibleSize(); auto origin = Director::getInstance()->getVisibleOrigin(); //线条容器 std::vector<LightLineRender::Line> lines; //设置线条位置 //闪电的起点和终点 Vec2 tFishPos(Vec2(visibleSize / 2) + origin); tFishPos = m_FishLayer->GetSpritePosition() + origin; Vec3 segStart = Vec3(0,0,-8); Vec3 segEnd = Vec3(touchLocation.x - tFishPos.x ,touchLocation.y - tFishPos.y ,-8); //取得方向 Vec3 dir = segEnd - segStart ; float fLength = dir.length(); dir.normalize(); //顺时针转动45度形成一个偏移点做为第一个闪电链线段。 Vec3 rotate_left; Mat4 rotate_left_Mat; kmMat4RotationZ(&rotate_left_Mat,MATH_DEG_TO_RAD(-45)); kmVec3TransformCoord(&rotate_left,&dir,&rotate_left_Mat); rotate_left.normalize(); //逆时针转动45度形成一个偏移点做为第一个闪电链线段。 Vec3 rotate_right; Mat4 rotate_right_Mat; kmMat4RotationZ(&rotate_right_Mat,MATH_DEG_TO_RAD(45)); kmVec3TransformCoord(&rotate_right,&dir,&rotate_right_Mat); rotate_right.normalize(); //分成三段闪电链 Vec3 v1_s = segStart ; Vec3 v1_e = segStart + dir * fLength / 4.0 + rotate_left * (fLength / 6.0); Vec3 v2_s = v1_e ; Vec3 v2_e = segStart + dir * fLength / 2.0 + rotate_right * (fLength / 6.0); Vec3 v3_s = v2_e ; Vec3 v3_e = segEnd; lines.push_back( LightLineRender::Line( v1_s, v1_e, 0 ) ); lines.push_back( LightLineRender::Line( v2_s, v2_e, 0 ) ); lines.push_back( LightLineRender::Line( v3_s, v3_e, 0 ) ); //创建出闪光链 LightLineRender* _lighting = dynamic_cast<LightLineRender*>(getChildByTag(10)); //使用线段容器创建闪电链 _lighting->setLines( lines ); _lighting->setPosition(tFishPos); //这一句可以让闪电链在1秒内渐渐消隐。它通过调节Shader中的u_color值从1变为0来实现。 _lighting->OpenAlphaToZero(1.0); //击中乌龟,让乌龟翻身。 m_FishLayer->AttackWuGui(); }
static void dlUpdateMatrix( dlObject *object ) { kmMat4 translation, rotation, scale, temp; CALL("%p", object); /* translation */ kmMat4Translation( &translation, object->translation.x, object->translation.y, object->translation.z ); /* rotation */ kmMat4RotationX( &rotation, kmDegreesToRadians(object->rotation.x) ); kmMat4Multiply( &rotation, &rotation, kmMat4RotationY( &temp, kmDegreesToRadians(object->rotation.y) ) ); kmMat4Multiply( &rotation, &rotation, kmMat4RotationZ( &temp, kmDegreesToRadians(object->rotation.z) ) ); /* scale */ kmMat4Scaling( &scale, object->scale.x, object->scale.y, object->scale.z ); /* build matrix */ kmMat4Multiply( &translation, &translation, &rotation ); kmMat4Multiply( &object->matrix, &translation, &scale ); object->transform_changed = 0; }
void Transform::flush() { if (m_needFlush) { m_needFlush=false; kmMat4Identity(&m_matrix); kmMat4 t_mat; //position kmMat4Identity(&t_mat); kmMat4Translation(&t_mat,m_x,m_y,0); kmMat4Multiply(&m_matrix, &m_matrix, &t_mat); //rotation kmMat4Identity(&t_mat); kmMat4RotationZ(&t_mat, m_rotationZ*PI/180.0f); kmMat4Multiply(&m_matrix, &m_matrix, &t_mat); //scale kmMat4Identity(&t_mat); kmMat4Scaling(&t_mat, m_scaleX, m_scaleY, 1); kmMat4Multiply(&m_matrix, &m_matrix, &t_mat); //anchorPoint kmMat4Identity(&t_mat); kmMat4Translation(&t_mat,(-m_anchorX*m_width),(-m_anchorY*m_height),0); kmMat4Multiply(&m_matrix, &m_matrix, &t_mat); } }
kmMat4* hueRotation(kmMat4* m, float r) { kmMat4 mat0; kmMat4 mat1; kmMat4 temp; // Make an identity matrix. kmMat4Identity(&mat0); // Rotate the grey vector into positive Z. // Sin = 1/sqrt(2). // Cos = 1/sqrt(2). kmMat4RotationX(&temp, M_PI_4); kmMat4Multiply(&mat1, &temp, &mat0); // Sin = -1/sqrt(3). // Cos = sqrt(2/3). kmMat4RotationY(&temp, -0.615479709); kmMat4Multiply(&mat0, &temp, &mat1); // Shear the space to make the luminance plane horizontal. float lx, ly, lz; xformRGB(&mat0, rwgt, gwgt, bwgt, &lx, &ly, &lz); float zsx = lx / lz; float zsy = ly / lz; shearZMatrix(&temp, zsx, zsy); kmMat4Multiply(&mat1, &temp, &mat0); // Rotate the hue. float rad = r * M_PI / 180; kmMat4RotationZ(&temp, rad); kmMat4Multiply(&mat0, &temp, &mat1); // Unshear the space to put the luminance plane back. shearZMatrix(&temp, -zsx, -zsy); kmMat4Multiply(&mat1, &temp, &mat0); // Rotate the grey vector back into place. // Sin = 1/sqrt(3). // Cos = sqrt(2/3); kmMat4RotationY(&temp, 0.615479709); kmMat4Multiply(&mat0, &temp, &mat1); // Sin = -1/sqrt(2). // Cos = 1/sqrt(2). kmMat4RotationX(&temp, -M_PI_4); kmMat4Multiply(&mat1, &temp, &mat0); kmMat4Fill(m, mat1.mat); return m; }
/** * Builds a rotation matrix from pitch, yaw and roll. The resulting * matrix is stored in pOut and pOut is returned */ kmMat4* kmMat4RotationYawPitchRoll(kmMat4* pOut, const kmScalar pitch, const kmScalar yaw, const kmScalar roll) { kmMat4 yaw_matrix; kmMat4RotationY(&yaw_matrix, yaw); kmMat4 pitch_matrix; kmMat4RotationX(&pitch_matrix, pitch); kmMat4 roll_matrix; kmMat4RotationZ(&roll_matrix, roll); kmMat4Multiply(pOut, &pitch_matrix, &roll_matrix); kmMat4Multiply(pOut, &yaw_matrix, pOut); return pOut; }
void drawSprite(float x, float y, float w, float h, float a, int tex) { glUseProgram(__spr.spriteProg); kmMat4Assign(&__spr.otm, &__spr.opm); kmMat4Translation(&__spr.t, x, y, -1); // support z layers? kmMat4RotationZ(&__spr.r,a); kmMat4Multiply(&__spr.t,&__spr.t,&__spr.r); kmMat4Multiply(&__spr.otm, &__spr.otm, &__spr.t); glEnable(GL_BLEND); glDisable(GL_DEPTH_TEST); glBindTexture(GL_TEXTURE_2D, tex); glEnableVertexAttribArray(__spr.vert_attrib); glBindBuffer(GL_ARRAY_BUFFER, __spr.quadvbo); glVertexAttribPointer(__spr.vert_attrib, 3, GL_FLOAT, GL_FALSE, 0, 0); glEnableVertexAttribArray(__spr.uv_attrib); glBindBuffer(GL_ARRAY_BUFFER, __spr.texvbo); glVertexAttribPointer(__spr.uv_attrib, 2, GL_FLOAT, GL_FALSE, 0, 0); glUniform1i(__spr.texture_uniform, 0); glUniform2f(__spr.u_size, w,h); glUniformMatrix4fv(__spr.opm_uniform, 1, GL_FALSE, (GLfloat *) & __spr.otm); glDrawArrays(GL_TRIANGLES, 0, 6); glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); glDisableVertexAttribArray(__glp.uv_attrib); glDisableVertexAttribArray(__glp.vert_attrib); }