Advertisement

Triangle rotation on X and Y axis cuts out?

Started by October 02, 2017 11:36 PM
3 comments, last by Promit 7 years, 5 months ago

I am attempting to rotate a triangle around the X / Y axis, but for some reason I cannot get the triangle to display in some cases (screen is blank)

Specific example:

If I am trying to rotate around the Y axis and use 45 degrees nothing shows. BUT using -45 degrees I see my triangle rotated correctly

If I am trying to rotate around the X axis and use 45 degrees nothing shows. BUT using -45 degrees I see my triangle rotated correctly

Am I missing something? I don't understand why I can't see it one direction but the other is fine. I understand that back-face culling happens by default, but in this case I should be able to see the triangle because I have not gone past the back-face culling threshold 


//Vertex data used
Vertex vertices[] =
{
  { 0.0f, 0.0f, 1.0f, Color(1.0f, 0.0f, 0.0f, 1.0f) },
  { 0.0f, 100.0f, 1.0f, Color(1.0f, 0.0f, 0.0f, 1.0f) },
  { 100.0f, 100.0f, 1.0f, Color(1.0f, 0.0f, 0.0f, 1.0f) }
};

//Matrix setup. Matrices are column-major
//My Matrix4 class are Identity matrix by default
Matrix4 model; 
model.rotateY(45); //rotate 45 degrees and disappear :( Same happens if the call is changed to rotateX
Matrix4 view;
Matrix4 projection;
projection.makeOrthoLH(); //Using an orthogrpahic projection

//Create the mvp
Matrix4 mvp = projection * view * model;

//Map the mvp matrix to the constant buffer
D3D11_MAPPED_SUBRESOURCE mapResource;
HRESULT mapped = deviceContext->Map(cbuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &mapResource);
((FLOAT*)mapResource.pData)[0] = mvp.data[0];
((FLOAT*)mapResource.pData)[1] = mvp.data[1];
((FLOAT*)mapResource.pData)[2] = mvp.data[2];
((FLOAT*)mapResource.pData)[3] = mvp.data[3];
((FLOAT*)mapResource.pData)[4] = mvp.data[4];
((FLOAT*)mapResource.pData)[5] = mvp.data[5];
((FLOAT*)mapResource.pData)[6] = mvp.data[6];
((FLOAT*)mapResource.pData)[7] = mvp.data[7];
((FLOAT*)mapResource.pData)[8] = mvp.data[8];
((FLOAT*)mapResource.pData)[9] = mvp.data[9];
((FLOAT*)mapResource.pData)[10] = mvp.data[10];
((FLOAT*)mapResource.pData)[11] = mvp.data[11];
((FLOAT*)mapResource.pData)[12] = mvp.data[12];
((FLOAT*)mapResource.pData)[13] = mvp.data[13];
((FLOAT*)mapResource.pData)[14] = mvp.data[14];
((FLOAT*)mapResource.pData)[15] = mvp.data[15];
deviceContext->Unmap(cbuffer, NULL);

makeOrthoLH method


void Matrix4::makeOrthoLH()
{
  //LH ORTHO hardcode in for 800x600, where near is 0.0f and far is 100.0f
  //------------------------------------
  FLOAT w = 800.0f; 
  FLOAT h = 600.0f;
  FLOAT n = 0.0f;
  FLOAT f = 100.0f;

  data[0] = 2.0f / w;
  data[1] = 0.0f;
  data[2] = 0.0f;
  data[3] = 0.0f;

  data[4] = 0.0f;
  data[5] = 2.0f / h;
  data[6] = 0.0f;
  data[7] = 0.0f;

  data[8] = 0.0f;
  data[9] = 0.0f;
  data[10] = 1 / (f - n);
  data[11] = 0.0f;

  data[12] = 0;
  data[13] = 0;
  data[14] = -n / (f-n);
  data[15] = 1.0f;
}

rotateY method


void Matrix4::rotateY(FLOAT degrees)
{
  FLOAT cosVal = cosf(degrees * PI/180.0f);
  FLOAT sinVal = sinf(degrees * PI/180.0f);
  FLOAT rot[16] = {
    cosVal, 0, -sinVal, 0,
    0, 1, 0, 0,
    sinVal, 0, cosVal, 0,
    0, 0, 0, 1
  };

  Matrix4 r(rot);
  data[0] = r.data[0];
  data[1] = r.data[1];
  data[2] = r.data[2];
  data[3] = r.data[3];

  data[4] = r.data[4];
  data[5] = r.data[5];
  data[6] = r.data[6];
  data[7] = r.data[7];

  data[8] = r.data[8];
  data[9] = r.data[9];
  data[10] = r.data[10];
  data[11] = r.data[11];

  data[12] = r.data[12];
  data[13] = r.data[13];
  data[14] = r.data[14];
  data[15] = r.data[15];
}

Shader being used


cbuffer mvpBuffer : register(b0)
{
	matrix mvp;
};

struct VOut
{
	float4 position : SV_POSITION;
	float4 color : COLOR;
};

VOut VShader(float3 position : POSITION, float4 color : COLOR)
{
	VOut output;
	output.position = mul(mvp, float4(position, 1.0f));
	output.color = color;

	return output;
}

float4 PShader(float4 position : SV_POSITION, float4 color : COLOR) : SV_TARGET
{
	return color;
}

 

 

What happens if you apply a rotation of -1 degrees? Does it still disappear? If not, then where DOES it disappear?

SlimDX | Ventspace Blog | Twitter | Diverse teams make better games. I am currently hiring capable C++ engine developers in Baltimore, MD.
Advertisement

So I figured it out, my near and far values were just too low


projection.makeOrthoLH()

Changed to


//Width, height, near, far
projection.makeOrthoProjection(800.0f, 600.0f, -300.0f, 300.0f);

For some reason I just thought depth was thrown out of the equation when it came to the ortho projection and I didn't think those values (near and far) mattered, but I guess things will still get clipped out of the view if they don't fall with in the volume zone 

Can anyone explain the difference between D3DXMatrixPerspectiveRH and D3DXMatrixPerspectiveFovRH? Does the D3DXMatrixPerspectiveRH just not have a FOV? How does FOV effect the projection?

2 hours ago, noodleBowl said:

Can anyone explain the difference between D3DXMatrixPerspectiveRH and D3DXMatrixPerspectiveFovRH? Does the D3DXMatrixPerspectiveRH just not have a FOV? How does FOV effect the projection?

They're two different expressions of the same thing. The latter takes aspect and FoV-Y. The former takes the dimensions of the near plane. You can derive these quantities from each other with some simple trig.

SlimDX | Ventspace Blog | Twitter | Diverse teams make better games. I am currently hiring capable C++ engine developers in Baltimore, MD.

This topic is closed to new replies.

Advertisement