// rend_primitive 相机空间 void Renderer::ModelViewTransform(const Matrix44 &model_view) { Matrix33 normal_trans = model_view.GetMatrix33(); normal_trans.SetInverse(); normal_trans.SetTranspose(); // 转换灯光位置 if (light_) { Vector4 pl; pl.SetVector3(light_->position); pl.w = 1.0f; pl = pl * model_view; light_pos_ = pl.GetVector3(); } #if 0 for (int i = 0; i < rend_primitive_.size; ++i) { if (((i + 1) % 3) == 0) { Vector3 p0 = rend_primitive_.vertexs[i - 2].position.GetVector3(); Vector3 p1 = rend_primitive_.vertexs[i - 1].position.GetVector3(); Vector3 p2 = rend_primitive_.vertexs[i].position.GetVector3(); Vector3 e0 = p0 - p1; Vector3 e1 = p1 - p2; Vector3 n = rend_primitive_.vertexs[i-1].normal; float dot = DotProduct(e0, n); // Logger::GtLogInfo("before:0\t%f", dot); assert(equalf(dot, 0, 0.001)); dot = DotProduct(e1, n); // Logger::GtLogInfo("before:1\t%f", dot); assert(equalf(dot, 0, 0.001)); } } #endif for (int i = 0; i < rend_primitive_.size; ++i) { Vector4 &position = rend_primitive_.vertexs[i].position; position = position * model_view; Vector3 &normal = rend_primitive_.vertexs[i].normal; normal = normal * normal_trans; normal.SetNormalize(); } #if 0 for (int i = 0; i < rend_primitive_.size; ++i) { if (((i + 1) % 3) == 0) { Vector4 p0 = rend_primitive_.vertexs[i - 2].position; Vector4 p1 = rend_primitive_.vertexs[i - 1].position; Vector4 p2 = rend_primitive_.vertexs[i].position; Vector3 e0 = (p0 - p1).GetVector3(); Vector3 e1 = (p1 - p2).GetVector3(); Vector3 N = CrossProduct(e0, e1); N.SetNormalize(); float dot = DotProduct(N, e0); Logger::GtLogInfo("dot e0 \t%f", dot); dot = DotProduct(N, e1); Logger::GtLogInfo("dot e1 \t%f", dot); Vector3 n0 = rend_primitive_.vertexs[i - 2].normal; Vector3 n1 = rend_primitive_.vertexs[i - 1].normal; Vector3 n2 = rend_primitive_.vertexs[i].normal; Vector3 zero = CrossProduct(N, n1); zero.Display(); dot = DotProduct(e0, n0); Logger::GtLogInfo("after:0\t%f", dot); dot = DotProduct(e1, n0); Logger::GtLogInfo("after:1\t%f", dot); } } #endif }