Début de moteur 3d

Soyez le premier à donner votre avis sur cette source.

Vue 13 181 fois - Téléchargée 1 234 fois

Description

Bon ben... voilà un moteur 3D (encore un)
Il s'appelle Chakra Engine en théorie (parce qu'il devait servir à un jeu qui s'appelle Chakra Meltdown, merci de ne pas rire du nom ridicule)
Il supporte DirectX/OpenGL et éventuellement un mode software (qui ne marche pas)
Sous DirectX les textures ne fonctionnent pas (je ne sais pas non plus pourquoi) car mal envoyées à la carte graphique je pense

Quand vous choisissez le mode : la différence entre OpenGL et OpenGLVBO est que le deuxième fonctionne plus comme DirectX avec l'envoi des buffers vers la carte graphique et tout, donc si OpenGLVBO marche pas, mettez OpenGL

Le zip ne contient que le moteur et le code que je mets ici permet de tester mais vous pouvez écrire le votre très simplement, il faut juste inclure le .lib (dans le projet) et chakraengine.h (dans chaque fichier) qui sont dans le répertoire "Fichiers" du zip

Le programme de test (cf la capture d'écran pour le résultat) tourne environ à 50 fps sur mon Athlon XP 2600+ Radeon 9200

J'ai mis en commentaire dans le code les lignes utilisant textures, models, etc que je ne fournis pas avec (taille trop volumineuse)

Source / Exemple :


/* Voici le code d'un programme de test du moteur */

#include <windows.h>
#include "..\moteur\include\chakraengine.h"

#ifdef _DEBUG
#pragma comment(lib, "..\\moteur\\debug\\lib\\ChakraEngine.lib")
#else
#pragma comment(lib, "..\\moteur\\lib\\ChakraEngine.lib")
#endif

ce::ChakraEngineDevice* device;
ce::Scene* scene;
ce::objects::Camera* camera;
ce::objects::Light* light;
ce::objects::Object* object;
ce::objects::Object* object2;

LRESULT CALLBACK wnproc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	static PAINTSTRUCT ps;
	POINT* pt = new POINT;
	GetCursorPos(pt);

	switch(uMsg) {
		case WM_CLOSE:
			PostQuitMessage(0);
			return 0;

		case WM_KEYDOWN:
			switch(wParam) {
				case VK_DOWN:
					camera->advanceInCameraDirection(-2);
					break;
				case VK_UP:
					camera->advanceInCameraDirection(2);
					break;
			}
			return 0;

		case WM_LBUTTONUP:
			break;

		case WM_PAINT:
			device->render(scene);
			BeginPaint(hWnd, &ps);
			EndPaint(hWnd, &ps);
			return 0;
	}

	delete pt;

	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	try {
		device = ce::createDevice(ce::CE_OPENGLVBO, wnproc, 800, 600, 32, false);
		device->setViewDistance(1024);

		scene = ce::createScene();

		camera = ce::objects::createCamera();
		camera->setPosition(ce::unites::vector3df(20, 45, 15));
		camera->setTarget(ce::unites::vector3df(59, 120, 34));

		light = ce::objects::createLight(ce::objects::CE_LIGHT_DIRECTIONAL);
		light->setDirection(ce::unites::vector3df(0.0f, -0.8f, 0.0f));
		light->setColor(ce::unites::Color(255, 235, 235, 255));

		//object = ce::objects::createObjectFromMesh(ce::objects::createTerrainMesh(ce::resources::createTextureFromJPEG("worldl.jpg"), 256, 256, 64));
		object = ce::objects::createCubeMesh(2); // cette ligne sert à ce que vous pouvez compilez
		object->setScale(ce::unites::vector3df(2.0f, 1.0f, 2.0f));
		//object->setTexture(ce::resources::createTextureFromJPEG("worldt.jpg"));
		object->getMaterial()->setAmbient(ce::unites::Color(128, 128, 128, 255));
		object->getMaterial()->setDiffuse(ce::unites::Color(255, 255, 255, 255));
		object->getMaterial()->setSpecular(ce::unites::Color(255, 255, 255, 255));
		object->setPosition(ce::unites::vector3df(0, 0, 0));

		//object2 = ce::objects::createObjectFromMesh(ce::objects::createMeshFromMD2("dino.md2"));
		object2 = ce::objects::createCubeMesh(5); // cette ligne sert à ce que vous pouvez compilez
		//object2->setTexture(ce::resources::createTextureFromJPEG("dino.jpg"));
		object2->getMaterial()->setAmbient(ce::unites::Color(128, 128, 128, 128));
		object2->getMaterial()->setDiffuse(ce::unites::Color(255, 255, 255, 255));
		object2->getMaterial()->setSpecular(ce::unites::Color(255, 255, 255, 255));
		object2->setRotation(ce::unites::vector3df(270, 0, 0));
		object2->setPosition(ce::unites::vector3df(0, 50, 0));

		scene->setCurrentCamera(camera);

		scene->addObject(object);
		scene->addObject(object2);

		scene->addLight(light);
		scene->setAmbientLight(ce::unites::Color(255, 255, 255, 255));

		int dinoframe = 0;

		while(true) {
			MSG msg;
			if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
				if (msg.message == WM_QUIT) {
					break;
				} else {
					TranslateMessage(&msg);
					DispatchMessage(&msg);
				}
			} else {
				SetWindowText(device->getWindow(), String(String("Chakra Engine - Demonstration - WIP: ") + String(__DATE__) + " (" + String(__TIME__) + ") - Using " + device->getName() + " - FPS: " + String(device->getFPS())).c_str());

				RECT rc;
				GetWindowRect(device->getWindow(), &rc);
				camera->adaptAsFPSCamera((rc.right - rc.left) / 2, (rc.bottom - rc.top) / 2);

				/*object2->getMesh()->loadFrame(dinoframe);
				if (++dinoframe >= object2->getMesh()->getFramesCount())
					dinoframe = 0;*/

				device->beginRendering();
				device->render(scene);
				device->endRendering();
			}
		}
	} catch(ce::system::Error* err) {
		MessageBox(NULL, err->what(), "Error", NULL);
	}
}

Conclusion :


Encore beaucoup de bugs et beaucoup de passages où c'est mal foutu (presque aucun const, plein de int à la place de unsigned int, etc.)

Il y a plein de commandes qui sont là mais qui ne marchent pas (skybox, dessiner une image 2D, etc.) parce que j'avais modifié pleins de trucs et que je n'ai pas encore remis

Notez que la rentrée est dans une semaine et que je n'aurai plus le temps de travailler dessus après (je suis en terminale avec 5 * 8 heures par semaine, ok on a des perms sauf que je suis pas chez moi pendant les perms ^^ )

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

DeAtHCrAsH
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
-
C'est marrant tout le monde fait des débuts de moteur 3D, et après plus de nouvelles.
A quand la fin d'un moteur 3D alors?

^_^
CyberP
Messages postés
283
Date d'inscription
mercredi 8 janvier 2003
Statut
Membre
Dernière intervention
4 juillet 2007
2 -
Ben celui-ci marche déjà sauf qu'il ne charge que les .md2, .jpg, .bmp, .tga et qu'il reste pleins de bugs et de fonctionnalitées manquantes (bump mapping, plusieurs viewports, etc.)

J'ai oublié de préciser que j'ai désactivé DirectX ; pour l'activer il suffit d'enlever le "#define _NO_DIRECTX" dans chakraengine.h et de recompiler
Parce que si DirectX est activé il demande des .dll que la moitié des gens n'ont pas (c'est une connerie de microsoft parce que les mises à jours de DirectX 9.0c qui sortent tous les mois ne demandent pas les mêmes dll que la version originale, même si c'est toujours 9.0c)
cs_theidiot
Messages postés
56
Date d'inscription
lundi 16 août 2004
Statut
Membre
Dernière intervention
27 août 2005
-
Deathcrash>> dupuis quand un moteur 3d a t-il une finalitée?

En réalité un moteur 3d ne ce fini jamais... il y a toujours une continuité de developpement.

La question devrait-etre à quand un moteur 3d stable et fonctionnel?

^_^

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.