|
After you are done rendering the rest of the scene, reset your view matrix and projection matrix to width and height of your screen and with and ortho projection. Then Draw your cross hair in the center. It does not have to exist in world space. Basically, it is a HUB display on the near plan of your view.
ARon
|
|
|
|
|
But I want to do only rotation on cursor (it is same as three unit axes rotates about one fixed point) which was done on entire 3d model but to avoid pan and zoom operations. How to do this ???
|
|
|
|
|
I not sure what you are trying to do but this is how I draw an object(s) in space. Forgive me it I c#.
static public void RenderScence()
{
Object LockThis = new Object();
lock (LockThis)
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
#region Draw Scene From Camera View
#region Set the Current Camera Matrix
Matrix_44 HTotal = CurrentCamera.HTotal;
Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
Gl.glLoadMatrixf(HTotal.GetListValues());
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();
#endregion
foreach (ISpatialNode obj in WorldObjectList)
if (obj.IsVisible) obj.RenderOpenGL();
#endregion
Gl.glFinish();
}
}
Base on your description I would create a crosshair class and maintain it orientation and position in the world. When it is time to render the crosshair I would just loaded its Position and Rotation in to the ModelView matrix and then draw it as if it were in free space.
References.
My article on transforms easily adapted to c++.
Space and Matrix Transformations - Building a 3D Engine[^]
Others probably better
Interactive Techniques in Three-dimensional Scenes (Part 1): Moving 3D Objects with the Mouse using OpenGL 2.1[^]
A New Perspective on Viewing[^]
Arcball Module in C# - Tao.OpenGL[^]
ARon
|
|
|
|
|
Thanks for ur reply.
I have tried to reset the modelview matrix and projection matrix and I am successful to display axes 90 percent, the remaining problem is that while rotating the 3d model flickers (at start zoom - in and at end at normal size and position).
I have tried this code after finishing of rest 3d model drawing :
glMatrixMode(GL_PROJECTION);
glGetDoublev (GL_PROJECTION_MATRIX, projMatrix);
glLoadIdentity();
GLdouble gldAspectRatio = (GLdouble) ViewportSize.right/(GLdouble) ViewportSize.bottom;
glOrtho ( pViewVolumeAxe[0], pViewVolumeAxe[1],
pViewVolumeAxe[2]/gldAspectRatio,
pViewVolumeAxe[3]/gldAspectRatio,
pViewVolumeAxe[4], pViewVolumeAxe[5] );
glMultMatrixd(projMatrix);
glMatrixMode(GL_MODELVIEW);
glGetDoublev (GL_MODELVIEW_MATRIX ,modelMatrix);
glLoadIdentity();
glTranslated(-modelMatrix[12], -modelMatrix[13], -modelMatrix[13]);
glMultMatrixd(modelMatrix);
glPushMatrix();
glTranslatef(fXTrans, fYTrans, fZTrans);
|
|
|
|
|
Hi.
I can not good speack english . I want to collapsible regions (selected text) in the richtextbox control .
please see this image ::
http://www.sapphiresteel.com/IMG/gif/collapsible_region.gif
My language is C# .
|
|
|
|
|
Hi.
If I understand you correctly. the term you're searching for is 'Code Folding[^]'
|
|
|
|
|
The program in OpenGL with Texture just didnot work in my cimputer,which work well in others' computer.
where is the crux,any help is appreciated.
The code is in the former message.
|
|
|
|
|
I can't give a good answer for this, but I can comiserate:
If I use a rectangle to exclude an area from a Graphics drawing area in C#, on some machines it also excludes the pixel before and the pixel after the intended exclude area, but only for the horizontal axis.
Same video chip set on all machines, various drivers.
I just worked around it, but what a pain.
Silver member by constant and unflinching longevity.
|
|
|
|
|
From your code, it looked like the program gets the texture from a separate file. Did you copy the texture file to your computer along with the .exe?
You measure democracy by the freedom it gives its dissidents, not the freedom it gives its assimilated conformists.
|
|
|
|
|
First! Thanks for you help!
then, how could i copy the texture file to my compter along with the .exe!
I could not understand you say.
|
|
|
|
|
Hi,
it looks like pFile = fopen("桌面.bmp", "rb"); is opening an image file; so you need to have that present next to your EXE file.
one way is to copy the files manually (you probably only copied the EXE so far);
another way (more complex) would be to create an installer;
and finally you could turn the BMP file into a resource, that would then be stored inside the EXE (that requires some code changes to use it).
Luc Pattyn
I only read code that is properly indented, and rendered in a non-proportional font; hint: use PRE tags in forum messages
|
|
|
|
|
hi everyone,
I have vista service pack 1(64bit) and I installed "Microsoft DirectX SDK (June 2006)" now my question is can I use of Directx 10 or I should use of Directx9?
how can I undrestand which one of them can I use? I asked this question because I have problem with "D3D10CreateDeviceAndSwapChain".
Thanks?
|
|
|
|
|
Initially, you want to determine the capabilities of your graphics card. That really is the main determinant for which APIs you can use in your application. Many applications call GetDeviceCaps when first initializing the Direct3D Device (this is the recommended technique both at MSDN, and in all the books written about DirectX 9 and 10 that I've read).
Have a look at: D3DCAPS Structure[^] over at MSDN.
|
|
|
|
|
My graphic card is 8600 gts and it supports of Directx 10.
|
|
|
|
|
Probably the most comprehensive approach is to look for the Utility that comes with the DirectX SDK (both version 9 and 10). It lives in the Utilities directory of wherever you installed the SDK on disc. As I recall, it's name is something obvious like, "DX9Capabilities". Launch it, and it will automatically query your Graphics Card and show you graphically what it's capabilities are. Then all you have to do is do a little research into what each designation actually means. The documentation that comes with the SDK should explain it all. You will discover that some DirectX APIs don't work because your Graphics Card doesn't perform a certain operation. It's a tedious process, but necessary in many circumstances where you are actually instructing the GPU to perform some computation (just by calling a standard DirectX API in your code). The API will often just fail silently, or return an almost useless error code like, D3DERR_INVALIDCALL. Determining your Graphics card capabilities beforehand prevents this kind of thing.
|
|
|
|
|
unsigned int ID;
int imageWidth;
int imageHeight;
unsigned char *image;
FILE *pFile = 0;
BITMAPINFOHEADER bitmapInfoHeader;
BITMAPFILEHEADER header;
unsigned char textureColors = 0;
pFile = fopen("桌面.bmp", "rb");
if(pFile == 0) return false;
fread(&header, sizeof(BITMAPFILEHEADER), 1, pFile);
if(header.bfType != BITMAP_ID)
{
fclose(pFile);
return false;
}
fread(&bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, pFile);
imageWidth = bitmapInfoHeader.biWidth;
imageHeight = bitmapInfoHeader.biHeight;
if(bitmapInfoHeader.biSizeImage == 0)
bitmapInfoHeader.biSizeImage = bitmapInfoHeader.biWidth *
bitmapInfoHeader.biHeight * 3;
fseek(pFile, header.bfOffBits, SEEK_SET);
image = new unsigned char[bitmapInfoHeader.biSizeImage];
fread(image, 1, bitmapInfoHeader.biSizeImage, pFile);
for(int index = 0; index < (int)bitmapInfoHeader.biSizeImage; index+=3)
{
textureColors = image[index];
image[index] = image[index + 2];
image[index + 2] = textureColors;
}
fclose(pFile);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glGenTextures(1, &ID);
glBindTexture(GL_TEXTURE_2D, ID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, imageWidth,
imageHeight, GL_RGB, GL_UNSIGNED_BYTE,
image);
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
glPushMatrix();
glScaled(45.0,30.0,0);
glBindTexture(GL_TEXTURE_2D, ID);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.0f, 1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 0.0f, -1.0f, 0.0f);
glEnd();
glPopMatrix();
GLvoid ReShapeGLScene( GLsizei width,GLsizei height )
{
glViewport(0,0,(GLsizei)width,(GLsizei)height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho((GLdouble)-450.0,(GLdouble)450.0,(GLdouble)-300.0,(GLdouble)300.0,50.0,-10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
I think i must be somewhere wrong ,but i am not a expert,and cannot find it .The followings are some set about my code
static PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW|
PFD_SUPPORT_OPENGL|
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
24,
0,0,0,0,0,0,
0,
0,
0,
0,0,0,0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0,0,0
};
thanks advance
|
|
|
|
|
For the PIXELFORMATDESCRIPTOR you set the pixel type to PFD_TYPE_RGBA so i think you need to set the colorbits to 32 instead of 24.
And for the mipmaps
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, imageWidth, imageHeight, GL_RGB, GL_UNSIGNED_BYTE, image);
try this instead
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, imageWidth, imageHeight, GL_RGBA, GL_UNSIGNED_BYTE, image);
or
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, imageWidth, imageHeight, GL_BGRA, GL_UNSIGNED_BYTE, image);
notice the fifth parameter. This is what I use for loading Windows bitmap into texture.
|
|
|
|
|
not work,The program work well in others' computer,But failed again in my computer.
My gpu is nViDIA, geforce G210M.
I think it something with my gpu.
But I knouw nothing about it
Thanks all the same
|
|
|
|
|
What size is the image you're trying to use as a texture? I haven't played with OpenGL for a bit but I seem to remember the image has to be sized to even powers of 2. For example, 2, 4, 8, 16, 32....
You measure democracy by the freedom it gives its dissidents, not the freedom it gives its assimilated conformists.
|
|
|
|
|
|
I have a third party dll that is written in C++ that saves a bitmap image as the actual grayscale values and not a Bitmap format. I am looking for a way to read in the grayscale values and convert them to use C#/.NET 's Bitmap class.
Thanks
|
|
|
|
|
I'm guessing you mean something like :
file: 256, 0,0 ,12,25,89.. val_n.. etc...EOF (for a 16X16 image)
then the easiest way (C#) is to read the values into program then create a bitmap and read the values into pixels as:
Bitmap.SetPixel(X,Y, Color.FromRGB(val_n,val_n,val_n));
iterate and save bitmap done.
|
|
|
|
|
I have a problem when two images are overlapping in a area. Then I have to draw both the images side by side in such a way that they seems to be merging. I am drawing first image and then second image on same memory buffer. Now my problem is how to determine which pixel to draw (old Image/new Image). As to show merging I don't want to overwrite all the pixels of old image with new image. I have four color to play with.(ForeColor, BackColor, Old Memory Buffer Color, New Memory Buffer Color). All the images are color and using grayScale Alpha blending on edges so we will have lots of different color pixel in one image specially on edges. I hope some of graphics designer must have face this problem. Please let me know the approach or some algo to decide. Currently I am using one method to check the new memory color and old memory color distance from foreground color and printing the closer one. Also I did same with background color and printing which is far from background color. These are failing some time specially if I choose foreground and background color same.(Condition :-Main part of both Picture must be using foreground color as this is character text and that part should not be overwritten.).
Thanks in advance.
|
|
|
|
|
The general problem is called "image stitching" and a lot of software exists to handle stitching photographs into panoramic views. It sounds like your case is less general but the procedures probably are similar.
You measure democracy by the freedom it gives its dissidents, not the freedom it gives its assimilated conformists.
|
|
|
|
|
Thanks Tim.
This information helped me to find related stuff. But my problem is specially with same foreground and background color. You can think I have some text and each character is surrounded by clouds. Now I need to print these correctly rendered text in buffer so that surrounding cloud of text should be evenly overlapped but it should not overwrite the main text. My problem is mainly with same background and foreground color. Also my current code is very simple and I don't want to use any complex function(which is most of filters are doing) to get the correct pixel.
|
|
|
|
|