Focus to object

Started by
0 comments, last by slicer4ever 10 years, 8 months ago

Hi!

I have the following problem. I want to zoom to my object. I have the camera in sphere coordinates. So the camera position has 2 angles and a length. For zooming I want to change the length of the camera, so that the object has the maximal expansion on the screen. The object is a bridge. So it has 8 corner points, which I transformed into screen space. This is what I tried to get the length, but it is not working correct. Can anyone help me? Can anyone see the problem:


float xmin, xmax, ymin, ymax, zmin, zmax;
	xmin = - m_width / 2;
	xmax = m_width / 2;
	ymin = -(m_height * scale_factor - m_height/2);
	ymax = m_height /2;
	zmin = -m_length / 2;
	zmax = m_length / 2;

	std::vector<D3DXVECTOR4> points;
	D3DXVECTOR4 point;

	point = D3DXVECTOR4(xmin, ymin, zmin,1.0f);
	points.push_back(point);

	point = D3DXVECTOR4(xmin, ymin, zmax, 1.0f);
	points.push_back(point);

	point = D3DXVECTOR4(xmin, ymax, zmax,1.0f);
	points.push_back(point);

	point = D3DXVECTOR4(xmin, ymax, zmin,1.0f);
	points.push_back(point);

	
	point = D3DXVECTOR4(xmax, ymin, zmin, 1.0f);
	points.push_back(point);

	point = D3DXVECTOR4(xmax, ymin, zmax, 1.0f);
	points.push_back(point);

	point = D3DXVECTOR4(xmax, ymax, zmax, 1.0f);
	points.push_back(point);

	point = D3DXVECTOR4(xmax, ymax, zmin,1.0f);
	points.push_back(point);

	D3DXMATRIX worldMatrix, projectionMatrix, viewMatrix;
	m_Begrenzung->GetWorldMatrix(worldMatrix);
	m_D3D->GetProjectionMatrix(projectionMatrix);
	m_Camera->GetViewMatrix(viewMatrix);


	for(int i = 0; i < points.size(); i++)
	{
		
		D3DXVec4Transform(&points.at(i), &points.at(i), &worldMatrix);
		D3DXVec4Transform(&points.at(i), &points.at(i), &viewMatrix);
		D3DXVec4Transform(&points.at(i), &points.at(i), &projectionMatrix);
		points.at(i).x = points.at(i).x / points.at(i).w;
		points.at(i).y = points.at(i).y / points.at(i).w;
		points.at(i).z = points.at(i).z / points.at(i).w;
		points.at(i).w = 1.0f;

	}



	xmin = xmax = points.at(0).x;
	ymin = ymax = points.at(0).y;

	for(int i = 1; i < points.size(); i++)
	{
		if(points.at(i).x < xmin)
			xmin = points.at(i).x;
		if(points.at(i).x > xmax)
			xmax = points.at(i).x;
		if(points.at(i).y < ymin)
			ymin = points.at(i).y;
		if(points.at(i).y > ymax)
			ymax = points.at(i).y;
	}

	float width, height, scale, length;
	

	if(abs(xmax) > abs(xmin))
		width = abs(xmax);
	else
		width = abs(xmin);

	if(abs(ymax) > abs(ymin))
		height = abs(ymax);
	else
		height = abs(ymin);

	
	if(width > height)
		scale = 1/width;
		
	else
	scale = 1 / height;

	

	length = m_Camera->getLength();
	m_Camera->setLength(length / scale);
Advertisement
This should probably be placed in general programming(or math?), coding horrors isn't exactly about helping programming problems, it's more about the bad(and sometimes amazing) things people have/seen created.
Check out https://www.facebook.com/LiquidGames for some great games made by me on the Playstation Mobile market.

This topic is closed to new replies.

Advertisement