Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


#Actuallipsryme

Posted 12 February 2013 - 05:43 PM

I've come across this stupid problem with my camera and it is driving me nuts biggrin.png

Maybe someone has an idea of what's going wrong...

 

 

This is basically a standard camera I create:


StaticCamera::StaticCamera(CameraDescription desc) : BaseCamera(desc)
{
        // Assign values
	this->fov = desc.FoV;
	this->aspectRatio = desc.Aspect;
	this->nearClip = desc.nearClip;
	this->farClip = desc.farClip;

	this->camPosition = XMFLOAT4(desc.cameraPosition.x, desc.cameraPosition.y, desc.cameraPosition.z,           1.0f);
	this->camTarget = XMFLOAT4(desc.cameraTarget.x, desc.cameraTarget.y, desc.cameraTarget.z, 1.0f);
	this->camUp = XMFLOAT4(desc.cameraUp.x, desc.cameraUp.y, desc.cameraUp.z, 1.0f);


	// Create our perspective projection
	this->CreateViewProjection();
}


   
void StaticCamera::CreateViewProjection()
{
    XMVECTOR tempPos = XMLoadFloat4(&this->camPosition);
    XMVECTOR tempTarget = XMLoadFloat4(&this->camTarget);
    XMVECTOR tempUp = XMLoadFloat4(&this->camUp);

    XMMATRIX tempView = XMMatrixLookToLH(tempPos, tempTarget, tempUp);
    XMMATRIX tempProj = XMMatrixPerspectiveFovLH(this->fov, this->aspectRatio,
                                                 this->nearClip, this->farClip);

    XMMATRIX tempViewProjection = XMMatrixMultiply(tempView, tempProj);

    // Store results
    XMStoreFloat4x4(&this->viewProjection, tempViewProjection);
    XMStoreFloat4x4(&this->view, tempView);
    XMStoreFloat4x4(&this->projection, tempProj);
}

 

 

Here I set the data to my constant buffer:

D3D11_MAPPED_SUBRESOURCE mappedResource;

		// Lock the constant buffer so it can be written to
		this->deviceContext->Map(this->cbGBTransformsConstBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);

		// Get a pointer to the data in the constant buffer.
		cbGBufferTransforms* pTransformData = (cbGBufferTransforms*)mappedResource.pData;

		// Set each objects world transform matrix and draw it
		this->cbGBTransforms.World = this->opaquePrimitives.at(i)->GetTransform();
		XMMATRIX transposed = XMLoadFloat4x4(&this->cbGBTransforms.World);
		XMMATRIX worldViewProj = transposed * this->engine->GetCamera()->GetViewProjectionMatrix();
		XMStoreFloat4x4(&pTransformData->WorldViewProjection, XMMatrixTranspose(worldViewProj));

// Unlock the constant buffer
        this->deviceContext->Unmap(this->cbGBTransformsConstBuffer, 0);
 
 
 

 

   And my shader for the geometry:
   
struct VSI
{
	float4 Position  : POSITION;
	float2 UV		 : TEXCOORD0;
	float3 Normal    : NORMAL;
	float3 BiTangent : BINORMAL;
	float3 Tangent   : TANGENT;
};



PSI VS(VSI input)
{
	PSI output = (PSI)0;

	// Transform geometry for 3D projection
	output.Position = mul(input.Position, WorldViewProjection);

	// Transform to clip space position of previous frame
	output.PrevPositionCS = mul(float4(input.Position.xyz, 1.0f), PrevWorldViewProjection);
	output.PositionCS = output.Position;

	// Modify Tiling factor of textures
	output.UV = input.UV * TexCoordModifier;

	// Transform Tangent-BiTangent-Normal into world space
	output.Tangent = mul(input.Tangent, (float3x3)World);
	output.BiTangent = mul(input.BiTangent, (float3x3)World);
	output.Normal = mul(input.Normal, (float3x3)World);

	return output;
}

 

  Now for some reason my camera is always inverted (upside down and when using camera movement rotation is also wrong/inverted).

 

 

  Looks like this:

  http://d.pr/i/wZ0R


#1lipsryme

Posted 12 February 2013 - 05:42 PM

I've come across this stupid problem with my camera and it is driving me nuts :D

Maybe someone has an idea of what's going wrong...

 

 

This is basically a standard camera I create:


StaticCamera::StaticCamera(CameraDescription desc) : BaseCamera(desc)
{
        // Assign values
	this->fov = desc.FoV;
	this->aspectRatio = desc.Aspect;
	this->nearClip = desc.nearClip;
	this->farClip = desc.farClip;

	this->camPosition = XMFLOAT4(desc.cameraPosition.x, desc.cameraPosition.y, desc.cameraPosition.z,           1.0f);
	this->camTarget = XMFLOAT4(desc.cameraTarget.x, desc.cameraTarget.y, desc.cameraTarget.z, 1.0f);
	this->camUp = XMFLOAT4(desc.cameraUp.x, desc.cameraUp.y, desc.cameraUp.z, 1.0f);


	// Create our perspective projection
	this->CreateViewProjection();
}


void StaticCamera::CreateViewProjection()
{
    XMVECTOR tempPos = XMLoadFloat4(&this->camPosition);
    XMVECTOR tempTarget = XMLoadFloat4(&this->camTarget);
    XMVECTOR tempUp = XMLoadFloat4(&this->camUp);
 
    XMMATRIX tempView = XMMatrixLookToLH(tempPos, tempTarget, tempUp);
    XMMATRIX tempProj = XMMatrixPerspectiveFovLH(this->fov, this->aspectRatio,
                                                 this->nearClip, this->farClip);
 
    XMMATRIX tempViewProjection = XMMatrixMultiply(tempView, tempProj);
 
    // Store results
    XMStoreFloat4x4(&this->viewProjection, tempViewProjection);
    XMStoreFloat4x4(&this->view, tempView);
    XMStoreFloat4x4(&this->projection, tempProj);
}

Here I set the data to my constant buffer:

D3D11_MAPPED_SUBRESOURCE mappedResource;

		// Lock the constant buffer so it can be written to
		this->deviceContext->Map(this->cbGBTransformsConstBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);

		// Get a pointer to the data in the constant buffer.
		cbGBufferTransforms* pTransformData = (cbGBufferTransforms*)mappedResource.pData;

		// Set each objects world transform matrix and draw it
		this->cbGBTransforms.World = this->opaquePrimitives.at(i)->GetTransform();
		XMMATRIX transposed = XMLoadFloat4x4(&this->cbGBTransforms.World);
		XMMATRIX worldViewProj = transposed * this->engine->GetCamera()->GetViewProjectionMatrix();
		XMStoreFloat4x4(&pTransformData->WorldViewProjection, XMMatrixTranspose(worldViewProj));


// Unlock the constant buffer
        this->deviceContext->Unmap(this->cbGBTransformsConstBuffer, 0);
 
 

 

   And my shader for the geometry:
   
struct VSI
{
	float4 Position  : POSITION;
	float2 UV		 : TEXCOORD0;
	float3 Normal    : NORMAL;
	float3 BiTangent : BINORMAL;
	float3 Tangent   : TANGENT;
};



PSI VS(VSI input)
{
	PSI output = (PSI)0;

	// Transform geometry for 3D projection
	output.Position = mul(input.Position, WorldViewProjection);

	// Transform to clip space position of previous frame
	output.PrevPositionCS = mul(float4(input.Position.xyz, 1.0f), PrevWorldViewProjection);
	output.PositionCS = output.Position;

	// Modify Tiling factor of textures
	output.UV = input.UV * TexCoordModifier;

	// Transform Tangent-BiTangent-Normal into world space
	output.Tangent = mul(input.Tangent, (float3x3)World);
	output.BiTangent = mul(input.BiTangent, (float3x3)World);
	output.Normal = mul(input.Normal, (float3x3)World);

	return output;
}

 

  Now for some reason my camera is always inverted (upside down and when using camera movement rotation is also wrong/inverted).

 

 

  Looks like this:

  http://d.pr/i/wZ0R

 


PARTNERS