Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


#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