计算机图形学——三维图形变换、空间变换&投影变换

1.图形变换

void translate3dMatrix(float Tx, float Ty, float Tz)
{
    
    
	Ccg3DTransDoc *pDoc = (Ccg3DTransDoc *)m_pView->GetDocument();
	m_whoObject->transMatrix[3][0] += Tx;
	m_whoObject->transMatrix[3][1] += Ty;
	m_whoObject->transMatrix[3][2] += Tz;
}
void rotateX3Dmatrix(float S, float C)
{
    
    
	Ccg3DTransDoc *pDoc = (Ccg3DTransDoc *)m_pView->GetDocument();
	for (int i = 0; i < 4; i++) {
    
    
		float temp;
		temp = m_whoObject->transMatrix[i][1] * C - m_whoObject->transMatrix[i][2] * S;
		m_whoObject->transMatrix[i][2] = m_whoObject->transMatrix[i][1] * S +
		m_whoObject->transMatrix[i][2] * C;
		m_whoObject->transMatrix[i][1] = temp;
	}
}
void rotateY3Dmatrix(float S, float C)
{
    
    
	Ccg3DTransDoc *pDoc = (Ccg3DTransDoc *)m_pView->GetDocument();
	for (int i = 0; i < 4; i++) {
    
    
		float temp;
		temp = m_whoObject->transMatrix[i][0] * C + m_whoObject->transMatrix[i][2] * S;
		m_whoObject->transMatrix[i][2] = -m_whoObject->transMatrix[i][0] * S +
		m_whoObject->transMatrix[i][2] * C;
		m_whoObject->transMatrix[i][0] = temp;
	}
}
void rotateZ3Dmatrix(float S, float C)
{
    
    
	Ccg3DTransDoc *pDoc = (Ccg3DTransDoc *)m_pView->GetDocument();
	for (int i = 0; i < 4; i++) {
    
    
		float temp;
		temp = m_whoObject->transMatrix[i][0] * C - m_whoObject->transMatrix[i][1] * S;
		m_whoObject->transMatrix[i][1] = m_whoObject->transMatrix[i][0] * S +
		m_whoObject->transMatrix[i][1] * C;
		m_whoObject->transMatrix[i][0] = temp;
	}
}

2.空间变换

void TransSpaceObject()
{
    
    
	Ccg3DTransDoc *pDoc = (Ccg3DTransDoc *)m_pView->GetDocument();
	// First Trans Object according to its matrix
	for (int i = 0; i < m_whoObject->polyCount; i++) {
    
    
		for (int j = 0; j < m_whoObject->objectSpace[i].polyCount; j++) {
    
    
			m_whoObject->objectSpace[i].transObject[j].x =
			m_whoObject->objectSpace[i].polyObject[j].x * m_whoObject->transMatrix[0][0]+
			m_whoObject->objectSpace[i].polyObject[j].y * m_whoObject->transMatrix[1][0]+
			m_whoObject->objectSpace[i].polyObject[j].z * m_whoObject->transMatrix[2][0]+
			m_whoObject->transMatrix[3][0];
			m_whoObject->objectSpace[i].transObject[j].y =
			m_whoObject->objectSpace[i].polyObject[j].x * m_whoObject->transMatrix[0][1]+
			m_whoObject->objectSpace[i].polyObject[j].y * m_whoObject->transMatrix[1][1]+
			m_whoObject->objectSpace[i].polyObject[j].z * m_whoObject->transMatrix[2][1]+
			m_whoObject->transMatrix[3][1];
			m_whoObject->objectSpace[i].transObject[j].z =
			m_whoObject->objectSpace[i].polyObject[j].x * m_whoObject->transMatrix[0][2]+
			m_whoObject->objectSpace[i].polyObject[j].y * m_whoObject->transMatrix[1][2]+
			m_whoObject->objectSpace[i].polyObject[j].z * m_whoObject->transMatrix[2][2]+
			m_whoObject->transMatrix[3][2];
		}
	}
}

3.投影变换

void projectSpaceObject()
{
    
    
	Ccg3DTransDoc *pDoc = (Ccg3DTransDoc *)m_pView->GetDocument();
	// Project object to XOY plane
	for (int i = 0; i < m_whoObject->polyCount; i++) {
    
    
		if (m_whoObject->objectSpace[i].polyVisible) {
    
    
			for (int j = 0; j < m_whoObject->objectSpace[i].clipCount; j++) {
    
    
				m_whoObject->objectSpace[i].projectObject[j].x =
					-(m_whoObject->objectSpace[i].clipObject[j].x - pDoc->eyeX) /
					(m_whoObject->objectSpace[i].clipObject[j].z - pDoc->eyeZ) *
					pDoc->eyeZ + pDoc->eyeX;
				m_whoObject->objectSpace[i].projectObject[j].y =
					-(m_whoObject->objectSpace[i].clipObject[j].y - pDoc->eyeY) /
					(m_whoObject->objectSpace[i].clipObject[j].z - pDoc->eyeZ) *
					pDoc->eyeZ + pDoc->eyeY;
				m_whoObject->objectSpace[i].projectObject[j].z = 0.0f;
			}
		}
	}
	// Then draw project result on XOY project plane.
	glColor3f(1.0f, 1.0f, 1.0f);
	for (int i = 0; i < m_whoObject->polyCount; i++) {
    
    
		if (m_whoObject->objectSpace[i].polyVisible) {
    
    
			glBegin(GL_LINE_STRIP);
			for (int j = 0; j < m_whoObject->objectSpace[i].clipCount; j++)
				glVertex3f(m_whoObject->objectSpace[i].projectObject[j].x,
					m_whoObject->objectSpace[i].projectObject[j].y,
					m_whoObject->objectSpace[i].projectObject[j].z);
			glEnd();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_43405938/article/details/104250936