Home

PFC - ingeniería de sistemas y automática - umh

image

Contents

1. else this gt OCF gt UpdateAssembliesMatrices this gt Ensamblado this gt Ensamblado2 this gt ActorsVCIdArray this gt TransformArray int Herramienta3D AnyActorVisibleHasCollisioned Calcula colisiones this gt OCF gt CalculateCollisions int idActor int punteroActorId this gt ActorsVCIdArray vtkActor actor for int i 0 i lt this gt GetNumberOfActors i idActor punteroActorId i actor this gt ActorsArrayli Devuelve 1 si algun actor visible de la herramienta ha colisionado if this gt OCF gt HasCollisioned idActor amp amp this gt ActorVisibilityArray i 1 return 1 return 0 vtkOBJReader Herramienta3D ReadOBJFile char file this gt wavefront vtkOBJReader New this gt wavefront gt SetFileName file this gt wavefront gt Update return this gt wavefront void Herramienta3D teclaPulsada char tecla if tecla a tecla A cambia de accion this gt actionsArraylterator establecido el m ximo de acciones a 3 actionsArraylterator actionsArraylterator 3 if this gt actionsArray actionsArrayIterator NULL actionsArraylterator 0 cout lt lt Accion seleccionada lt lt this gt GetAction lt lt An else if tecla i tecla I cout lt lt Informacion actualmente la accion es lt lt this gt GetAction lt lt n Cap tul
2. Dados los OBBTrees de dos objetos el algoritmo de intersecci n gasta la mayor parte del tiempo en comprobar si se solapan pares de OBBs El test que realiza V Collide consiste en proyecciones axiales de las cajas Con esta proyecci n cada caja forma un intervalo en el eje Si los intervalos no se solapan entonces las cajas est n separadas Si los intervalos se solapan entonces quiz s haya colisi n pero es necesario realizar un test m s exacto Cu ntos tests son suficientes para determinar el contacto entre dos OBB s Sabiendo que dos polihedros convexos est n separados if existe un eje separador ortogonal a una cara de cualquier polihedro u ortogonal a un borde de cada polihedro Cada caja tiene 3 nicas orientaciones para los lados y 3 nicas direcciones para los cantos Esto conlleva a probar 15 ejes potencialmente separadores 3 lados para una caja 3 lados para la otra caja 9 combinaciones de pares para los cantos Si los polihedros est n separados entonces existe alg n eje separador y uno de los quince ejes ser un eje separador Si los polihedros est n solapados entonces no existir ning n eje separador Por eso probar los 15 ejes es un test suficiente para determinar si se solapan dos OBB s En la figura anterior se observa en 2D como L es un eje separador de los OBB s A y B ya que las proyecciones de A y B en L se corresponden con intervalos separados Para realizar el test la estrategia empleada
3. El par metro id Identificador de Vcollide Vcollide utiliza un identificador para cada objeto a adido al sistema de colisiones Necesita que se le pase un puntero a entero donde almacenar el identificador que le corresponda Se trata de una asignaci n ascendente empieza en cero y no se resetea nunca El par metro algorithm Se trata del objeto que queremos a adir al sistema de colisiones y puede ser cualquier tipo de objeto fuente disponible en vtk como por ejemplo un vtkSphereSource vtkConeSource etc as como un vtkOBJReader si hemos obtenido el objeto a partir de un archivo obj utilizado por ejemplo para obtener las piezas que componen las herramientas de laparoscopia Los par metros scaleX scaleY y scaleZ Para el que ya conozca VCollide sabr que tiene ciertas limitaciones o requisitos como por ejemplo que no soporta escalado de objetos y que requiere que los pol gonos de los objetos sean tri ngulos Estas limitaciones no hay que tenerlas en cuenta ya que AddObject previamente a su interacci n con VCollide incluye un filtro de triangularizaci n y un filtro de escalado par metros scaleX scaleY scaleZ Los par metros scaleX scale Y y scaleZ sirven para escalar el objeto en los ejes X Y y Z respectivamente Los posibles valores que pueden tomar estos par metros de escalado son 1 indica que no hay escalado 0 lt x lt l indica una reducci n del tama o gt l indica que un aumento del tama o El par
4. hasta aqui si el angulo es permitido En cuanto al m todo cliclzq se encarga de ejecutar la operaci n de Abrir Cerrar pinzas o de rotar la herramienta en funci n de la acci n correspondiente en el momento para cambiar de acci n se pulsa la a del teclado void Tijeras cliclzg float alfa 0 5 if strcmp this gt GetAction abrir 0 this gt AbrirCerrarPinzas alfa else if strcmp this gt GetAction rotar 0 this gt RotarHerramienta alfa El m todo clicDer hace exactamente lo mismo pero en direcci n opuesta Es decir en lugar de abrir cerrar y en lugar de rotar en un sentido en el opuesto A nivel de c digo la nica diferencia es el factor alfa que pasa a ser 0 5 Herramientas Fijas Una vez visto el ejemplo de la herramienta articulada la creaci n de una herramienta fija es similar salvo por las siguientes diferencias se utiliza un nico ensamblado para actualizar las rotaciones movimientos de las piezas en el sistema de colisiones se utiliza el m todo UpdateAssemblyMatrix en lugar del m todo UpdateAssembliesMatrices A continuaci n veremos el ejemplo de creaci n de un cutter tal y como se muestra en la figura Archivo Organo Herramienta Der Herramienta Izq Al igual que con la herramienta articulada la herramienta fija tambien tiene que heredar de la clase Herramienta3D class Cutter public Herramienta3D En cuanto al archivo
5. motion and animation de la universidad de Carolina del Norte The University of North Carolina at Chapel Hill Esta librer a realiza una detecci n r pida y exacta de colisiones entre modelos poligonales triangulados por lo que puede ser usada para realidad virtual y en una gran variedad de aplicaciones de simulaci n La librer a esta dise ada para operar en ambientes que contienen un gran n mero de objetos geom tricos formados con mallas de tri ngulos La ltima versi n disponible de V Collide es la 2 01 El c digo fuente est escrito en C y es descargable desde la siguiente direcci n de Internet http www cs unc edu geom V_COLLIDE request html Los pasos b sicos para el uso de esta librer a son crear los objetos a adir conjuntos de tri ngulos a estos objetos elegir que pares de objetos deben ser evaluados cambiar la posici n de estos objetos actualizando la matriz ejecutar el test de colisiones y conseguir los resultados del test Los tres ltimos pasos se repiten para cada paso de la simulaci n V Collide utiliza una arquitectura de detecci n de colisiones en tres etapas e Un test N body encuentra pares de objetos posiblemente colisionados e Un test jer rquico de OBBs Oriented Bounding Boxes encuentra posibles pares de tri ngulos colisionados e Un test exacto determina si un par de tri ngulos est n solapados La rutina N body tiene coherencia entre sucesivos intervalos de tiempo de una sim
6. Para realizar la acci n en sentido opuesto se ha de hacer clic en el bot n derecho En la imagen que se muestra a continuaci n se observa la grapadora despues de haber colocado unas cuantas grapas La diferente orientaci n de las grapas se consigue gracias a la capacidad de rotaci n de la parte articulada de la grapadora Ensamblado2 sobre su propio eje Archivo Organo Herramienta Der Herramienta Izq Tal y como muestra la imagen la aplicaci n permite la simulaci n de grapado a trav s de una trayectoria previamente definida Cap tulo 7 Conclusiones y trabajo futuro Conclusiones El principal objetivo que se pretend a lograr y que personalmente creo que se ha logrado ha sido la obtenci n de una aplicaci n de simulaci n en la que se modelen diferentes herramientas de laparoscopia y en la que adem s se implemente un sistema de detecci n colisiones a nivel de objeto A nivel personal debo decir que al tratarse de un proyecto creativo ha resultado una experiencia gratificante y que me ha permitido conocer dos librer as muy tiles para la programaci n gr fica como son VTK y QT Como ltima conclusi n me gustar a acabar diciendo que considero muy acertada la elecci n de un proyecto fin de carrera de este tipo para la obtenci n del t tulo de Ingeniero de Telecomunicaci n Tanto por el tipo de proyectos que oferta el departamento de rob tica y visi n por computador de area de Ingenier a y Sistemas d
7. de la aplicaci n habr que sacrificar el nivel de detalle y por consiguiente el n mero de pol gonos de los objetos 3D empleados Almacenado de las piezas en un formato adecuado Al crear una herramienta con 3DS Max el formato de trabajo por defecto es el de 3DS Max archivos con la extensi n max Este formato es muy adecuado para realizar el dise o de la herramienta y es una buena pr ctica guardar los trabajos en este formato Sin embargo para poder utilizar las piezas dise adas desde VTK hay que trabajar con un formato diferente Por supuesto hay m s de un formato diferente que se podr a emplear en VTK pero en este proyecto se ha optado por el formato wavefront archivos con la extensi n obj Para crear un objeto wavefront se ha de utilizar las opciones Export y o Export selected del men y a continuaci n elegir en Tipo Wavefront Object OBJ Para recuperar un objeto wavefront desde 3DS Max se ha de seleccionar la opci n Import del menu File En la siguiente imagen se puede ver Pinzal despues de haber sido importada Untitled Autodesk 3ds Max 8 Stand alone License Eile Edit Tools Group Views Create Modifiers Character reactor Animation GraphEditors Rendering Customize MAXScript Help AE AO Tei amp O amp 16 SES iip K T IAS OT fasr eur Standard Primitives gt Object Type AutoGrid JA d cy A k Pa se 2 Lel a Lo dh YE Q y y m y 10 20
8. debug and release no stl Mi consejo es elegir la ltima aunque debo advertir que tarda bastante tiempo contestar a todo y nmake puedes ir a hacerte un caf en mi port til Centrino 1GB 1 6 Ghz tarda media hora para el modo release Desde Panel de Control Sistema Opciones avanzadas Variables de entorno A adir al Path C Qt 4 2 3 bin Crear una nueva variable de entorno QMAKESPEC win32 msve2005 Reiniciar el equipo Para poder crear proyectos que utilicen QT para Visual Studio qmake project t vcapp o projectname pro Desde Visual Studio 2005 Tools gt Options gt Projects and Solutions gt VC directories C Qt 4 2 3 include en include files Paso 2 Descargar Cmake En mi caso he descargardo cmake 2 4 6 win32 x86 zip y lo he descomprimido dejando un acceso directo a CmakeSetup en el escritorio Paso 3 Instalaci n de VTK Descargar VTK en mi caso vtk 5 0 3 rar y descomprimir en c Ejecutar cmakesetup y marcar show advanced values Source C vtk 5 0 3 VTK Binaries C vtk 5 0 3 WTK_cmake esta carpeta la crear cmake Configure Nos preguntara IDE Microsoft Visual Studio 2005 Mis opciones BUILD_ EXAMPLES ON VTK_USE_GUISUPPORT ON El resto por defecto y Configure USE_QVTK ON El resto por defecto y Configure As hasta que aparezca todo en gris entonces OK Abrir C vtk 5 0 3 VTK_ cmake VTK sIn Seleccionar Release en la lista desplegable de Solution Configurations Seleccion
9. int id vtkAlgorithm algorithm double scaleX double scaleY double scaleZ char nombre vtkActor actor int PA indice Veamos a continuaci n qu son y para que sirven cada uno de los par metros de este m todo AddObject El par metro id Identificador de Vcollide Vcollide utiliza un identificador para cada objeto a adido al sistema de colisiones Necesita que se le pase un puntero a entero donde almacenar el identificador que le corresponda Se trata de una asignaci n ascendente empieza en cero y no se resetea nunca El par metro algorithm Se trata del objeto que queremos a adir al sistema de colisiones y puede ser cualquier tipo de objeto fuente disponible en vtk como por ejemplo un vtkSphereSource vtkConeSource etc as como un vtkOBJReader si hemos obtenido el objeto a partir de un archivo obj utilizado por ejemplo para obtener las piezas que componen las herramientas de laparoscopia Los par metros scaleX scaleY y scaleZ Para el que ya conozca VCollide sabr que tiene ciertas limitaciones o requisitos como por ejemplo que no soporta escalado de objetos y que requiere que los pol gonos de los objetos sean tri ngulos Estas limitaciones no hay que tenerlas en cuenta ya que AddObject previamente a su interacci n con VCollide incluye un filtro de triangularizaci n y un filtro de escalado par metros scaleX scaleY scaleZ Los par metros scaleX scale Y y scaleZ sirven para escalar el obj
10. metro nombre Sirve para asignar un nombre a la pieza colisionable El par metro actor El actor que representa a la pieza colisionable El par metro PA indice ndice del array PiezaArray Para llevar el control de los objetos colisionables que se est n utilizando en la aplicaci n se ha creado un Array din mico de tama o TAM MAX PIEZAS ARRAY PiezasArray de ah el primer t rmino de este par metro PA De igual forma que el par metro id el valor del ndice se asignar desde el propio m todo AddObject Array con informaci n sobre las piezas a adidas al sistema de colisiones ObjectInfo PiezasArray Structura de datos sobre cada objeto pieza del sistema de colisiones struct ObjectiInfo int VC_Id ID en VCollide char nombre 50 Nombre de la pieza vtkActor actor actor correspondiente a la pieza vtkTransformPolyDataFilter filtro filtro triangularizado y escalado bool isOrgano diferencia organos y herramientas Por ltimo se procede como es habitual en VTK es decir creaci n de un mapper asociaci n del mapper al actor y por ltimo se a ade el actor al Render Es muy importante tener en cuenta que el mapper necesita el filtro del objeto triangularizado y escalado Para obtenerlo basta utilizar el m todo GetFilterOfPiezasArray de la clase CollisionObjectFactory pas ndole como parametro el indice del array PiezasArray Ejemplo de creaci n de un objeto colisionable
11. Cutter cpp se compone de los siguientes m todos que a continuaci n veremos en detalle constructor de la clase destructor de la clase cliclzq clicDer El constructor de la clase se encarga de realizar mediante apoyo en la clase padre Herramienta3D las siguientes operaciones inicializaciones de objetos y variables necesarias asignaci n de nombres a cada una de las piezas y creaci n de actores vtkActor a partir de cada uno de los ficheros OBJ previamente generados asociaci n con el sistema de detecci n de colisiones e inclusi n de los objetos colisionables desactivaci n de la colisi n entra las propias piezas de la herramienta posicionamiento de las piezas para formar la herramienta y establecimiento del origen de rotaci n creaci n de un ensamblado vtkAssembly para modelar la herramienta Al tratarse de una herramienta fija tan s lo necesita del uso de un ensamblado Si por el contrario se desea modelar una herramienta articulada como vimos en el punto de Herramientas articuladas necesitariamos la creaci n de dos ensamblados Veamos a continuaci n el c digo del constructor de la clase Cutter Cutter Cutter Collision0bjectFactory factory int izq std cout lt lt Constructor de Cutter n char CUTTER Cutter char FILO Filo de Cutter Declaraciones char file char objectName vtkOBJReader piezaOBJ double scaleX scaleY scaleZ vtkPolyDataMapper auxMapp
12. EE B T Sphere wifrivs ia Parameters Radius 40 gt egments 30 FE M Smooth Hemisphere 0 4 E Chop C Squash Slice On Slice From 0 0 i Slice To 316 492 gt T Base To Pivot Generate Mapping Coords I7 Real World Map Size i EJ g E un eizfeassa 2l ar 10 0 a y a A me o O BODA Click and drag to select and move objects Set Key Key Fiters tor o B gt 6 E e f a O 25 w Sy A Q E i Y Q Y E El dise o de cualquier herramienta como se intuye a partir del ejemplo de las tijeras puede realizarse f cilmente a partir de la creaci n de objetos simples y su posterior modificaci n La optimizaci n de estos dise os queda relegada a otro estudio pero b sicamente el objetivo es la minimizaci n del n mero de pol gonos Esto tan s lo pretende ser un ejemplo de metodolog a de dise o Por supuesto cualquier otro tipo de metodolog a para el dise o puede ser perfectamente v lido Como se ha dejado entrever al hablar sobre la optimizaci n dado que las herramientas se integrar n en un sistema visual con detecci n de colisiones existe un compromiso en la relaci n detalle coste computacional En resumen si queremos un gran nivel de detalle utilizaremos un elevado n mero de pol gonos por lo que el coste computacional ser alto fundamentalmente debido al c lculo de las colisiones Por tanto para conseguir un funcionamiento suave
13. En cuanto al m todo GetAction devuelve el texto de la acci n asociada al clic de rat n en un determinado momento Para herramientas que tengan m s de una acci n asociada la forma de cambiar de acci n es pulsando la tecla a El cambio de acci n se realiza de forma c clica Por ejemplo para una herramienta que tenga asociadas tres acciones en el siguiente orden abrir rotar y grapar Al hacer clic con el rat n la acci n que ejecutar la herramienta ser la de abrir Si se pulsa a entonces la acci n ser rotar Si se vuelve a pulsar a la acci n ser grapar Al haber llegado a la ltima acci n al pulsar a la acci n seleccionada ser la primera es decir abrir y as sucesivamente Si se quiere saber qu acci n tiene asociada una herramienta en un determinado instante se puede pulsar 1 Azimuth y Elevation son los m todos que se encargan de mover la herramienta en azimuth y elevaci n respectivamente Antes de mostrar el movimiento en pantalla se comprueba si al mover la herramienta se produce alguna colisi n entre cualquier objeto visible de la herramienta En el caso de que haya colisi n de alg n objeto visible se deshace el movimiento y se vuelve a la posici n que ten a la herramienta antes de efectuar el movimiento RuedaDelante y ruedaAtras se encargan de calcular los desplazamientos que tiene que efectuar la herramienta hacia delante y hacia atr s respectivamente apoy ndose en
14. VCollide Collide int flag VC_ FIRST CONTACT Compute collisions If flag is VC FIRST CONTACT V Collide cts only the first intersection between each pair of objects If is VC_ALL CONTACTS V Collide reports the ids of all the intersecting triangles in each pair of intersecting objects Default is VC FIST CONTACT int VCollide Collide VCReport report int flag Compute collisions and return a collision report If flag is VCRe inc int Re int Re ob int Re pair the int Re VC If int VC_FIRST_CONTACT V Collide detects only the first between each pair of objects If flag is VC_ALL CONTACTS V Collide reports the ids of all the intersecting triangles in each pair of intersecting objects Default is VC_FIST CONTACT port Class lude lt VCollide H gt numObjPairs turns the number of pairs of objects that are in contact obj1ID int obj_pair_num turns the ID of the first object in the specified object pair j pair num ranges from 0 to numObjPairs 1 Error may occur if obj pair num is out of range obj2ID int obj pair num turns the ID of the second object in the specified object Error may occur if obj pair num is out of range numTriPairs int obj pair num turns the number of pairs of triangles that are in contact between the specified pair of objects This is useful only if ollide Collide was called with VC_ALL CON
15. al vector de objetos un puntero al objeto ya filtrado escalado y triangularizado this gt objetos numObj algorithmFiltered vtkCellArray celdas vtkCellArray New celdas algorithmFiltered gt GetOutput gt GetPolys falta identificador de triangulo int idTri 0 vtkIdType npts vtkIdType pts afiade los triangulos en base a la informacion de las celdas while celdas gt GetNextCell npts pts 0 vc AddTri matriz pts 0 matriz pts 1 matriz pts 2 idTri idTri vc EndObject std cout lt lt Objeto a adido OK al sistema de colisiones n se destruye la matriz dinamica for int i 0 i lt puntos gt GetNumberOfPoints 1 delete matriz il delete matriz std cout lt lt Matriz dinamica destruidaln tr gt Delete algorithmFiltered gt Delete celdas y puntos no hace triObject gt Delete cout lt lt Fin de AddObject n El m todo SetData0fO0bjectInPiezasArray rellena un elemento del array PiezasArray y devuelve el indice en el array o 1 error int SetData0fObjectInPiezasArray int VC_Id char nombre vtkActor actor vtkTransformPolyDataFilter filtro La clase CollisionObjectFactory La clase CollisionObjectFactory provee de diferentes m todos para el tratamiento de las colisiones as como de la estructura de datos para almacenar informaci n sobre los objetos a adidos al sistema de colisiones Las fu
16. building the data structures for these objects has some run time overhead E MANAGING ACTIVATION STAT V Collide s activation state determines which objects will be tested for collisions The activation state has two components a per object component and a pairwise component for each possible pair of objects These two components are managed independently so for a pair of objects to be tested for collision not only must the pair be active but each of the two objects must be active as well When an object is created it is active by default In addition all pairs of objects that include this new object are also active The pairwise component of the activation state is managed using the ActivatePair and DeactivatePair calls while the per object component is managed using the ActivateObject and DeactivateObject calls Because these components are managed independently modifying an objects activation state does not affect the activation state of an object s pairs Note to I Collide users do not confuse the ActivateObject call in V Collide with the activate full call in I Collide All the activation calls in I Collide operate on the pairwise activation state I Collide does not have a per object activation state MOVING OBJECTS To move an object call UpdateTrans This function takes as arguments the ID of the object and a new transformation for it express
17. covarianza 3 O 1 hace referencia a tiempo constante O n indica tiempo lineal O n k fijo indica tiempo polinomial O log n indica tiempo logar tmico O 2 hace referencia a tiempo exponencial etc Si hacemos que un punto x en el tri ngulo i sea parametrizado por s y t de la siguiente forma x p s q p t r p s t 0 1 El punto medio del casco convexo es entonces 14 1 Bug I amp I 5 u Sihh rr q r i Donde m rea del tri ngulo i simo a p x r p Los elementos de la matriz de covarianza C tienen la siguiente forma cerrada 1 z i i i i i i i i i i i LT o AR lG 9 F A 9 h A q irn ls j k lt 3 Donde p p u J q u r r u Dado un algoritmo para calcular OBB s estrechamente ajustados alrededor de un grupo de poligonos ahora necesitamos representarlos jerarquicamente V Collide utiliza un m todo de tipo top down es decir parte de un grupo de todos los poligonos para subdividirlo recursivamente hasta que los nodos hoja sean indivisibles La regla de subdivision que utiliza consiste en dividir el eje mas largo de una caja con un plano ortogonal a uno de sus ejes particionando los poligonos de acuerdo con qu lado del plano reside su punto central A continuaci n se muestra un ejemplo an logo en 2D Dado un modelo con n tri ngulos el tiempo en construir el rbol es O n 1g n si utilizamos un casco convexo y O n lg n en caso contrario
18. de las herramientas en f Visi n del campo operatorio mediante la c mara cirug a laparosc pica introducida por uno de los cortes practicados en la piel 11 Problema general de la simulaci n Un buen simulador quir rgico debe de cumplir una serie de caracter sticas debe mostrar los rganos internos de manera realista que estos rganos respondan a las interacciones con el cirujano por ejemplo deform ndose y que respondan mediante modificaciones estructurales a acciones quir rgicas habituales como cortes cauterizaci n o sutura El problema actual es que conforme los simuladores son m s complejos la imagen y la interrelaci n con el usuario es menos realista y no traducen el comportamiento real de los tejidos a nuestra actuaci n ya que estos simuladores requieren ordenadores y programas inform ticos m s grandes y complejos En resumen los principales problemas de la simulaci n Elevado coste computacional para simular la detecci n de colisiones la deformabilidad etc Elevada dificultad para lograr realismo 12 Estado del arte de la simulaci n quir rgica Los simuladores quir rgicos imponen dos restricciones a los entornos realismo virtual y f sico La primera requiere que los rganos se muestren lo m s fielmente posible a c mo aparecen en la cirug a real La segunda requiere que el comportamiento de los rganos sea lo m s similar posible al de los rganos reales La complejidad de este comportam
19. directa de las librer as y del parche La configuraci n del entorno requiere las siguientes operaciones el orden importa 1 Paso 1 Instalar y parchear QT 2 Paso 2 Descargar CMake 3 Paso 3 Instalaci n de VTK 4 Paso 4 Instalaci n de librer as V Collide y RAPID para detecci n de colisiones Paso 1 Instalar y parchear QT Para poder trabajar con QT y proyectos de Visual Studio hace falta utilizar una versi n comercial Sin embargo en Internet existe un parche para poder utilizar QT Open Source desde Visual Studio 2005 Estos son los pasos que yo he seguido descargar y descomprimir qt win opensource src 4 2 3 zip de trolltech com en C Qt 4 2 3 descargar acs 4 2 3 patchl zip de sourceforge es el parche para que la version open source de Qt funcione para Visual Studio 2005 Descomprimirlo en C Qt 4 2 3 Inicio gt Todos los programas gt MS V Studio 2005 gt Visual Studio Tools gt Command Prompt cd Ot 4 2 3 escribir s lo la inicial de cada carpeta y completar con tabulador como si estuvieramos en linux installpatch42 bat A continuaci n si queremos una configuraci n en modo release modo debug o ambos Aconsejo utilizar el modo debug o modo ambos ya que depurar puede resultar de gran ayuda para encontrar errores de c digo A continuaci n debemos elegir una de estas tres configuraciones qconfigure msvc2005 release gconfigure msvc2005 debug no stl gconfigure msvc2005
20. en el volumen que se desea renderizar El mallado se genera localmente teniendo en cuenta la pertenencia o no de los voxels m s pr ximos a uno situado en el l mite del objeto Dicha condici n de pertenencia permite la generaci n de un c digo de 8 bits a trav s del cual se puede determinar el mallado a aplicar a dicha zona 29 El principio de este algoritmo se basa en que es posible definir un voxel cubo por medio de los valores de los pixeles en las ocho esquinas del cubo Si uno o m s pixeles de un cubo tienen valores menores que el isovalor especificado por el usuario y uno o m s tienen valores mayores que su valor podemos concluir que voxel deber contribuir en algun componente de la superficie Debido a que las superficies tridimensionales anat micas ofrecen una herramienta medica muy til el algoritmo marching cubes es utilizada para procesar datos medicos Normalmente estos datos son adquiridos mediante tomograf a computerizada CT resonancias magn ticas MR o tomografias mediante emisi n de fotones simples SPECT y el algoritmo marching cubes permite la visualizaci n de modelos complejos La imagen superior muestra una imagen de la superficie de un cerebro construida mediante el uso de marching cubes Marching Squares Marching Squares es el algoritmo a partir del cual se han ido generando la mayor a de los algoritmos de reconstrucci n 3D y en concreto del que trata este documento por lo que comprend
21. lt n Almacena informaci n sobr 1 objeto en PiezasArray PA indice this gt SetDataOfObjectInPiezasArray numObj nombre actor algorithmFiltered cout lt lt COF ha asignado para un nuevo objeto el id interno lt lt PA indice lt lt n afiadimos al vector de objetos un puntero al objeto ya filtrado escalado y triangularizado this gt objetos numObj algorithmFiltered vtkCellArray celdas vtkCellArray New celdas algorithmFiltered gt GetOutput gt GetPolys identificador de triangulo int idTri 0 vtkIdType npts vtkIdType pts afiade los triangulos en base a la informacion de las celdas while celdas gt GetNextCell npts pts 0 vc AddTri matriz pts 0 matriz pts 1 matriz pts 2 idTri idTri vc EndObject std cout lt lt Objeto a adido OK al sistema de colisiones n se destruye la matriz dinamica for int i 0 i lt puntos gt GetNumberOfPoints i delete matriz il delete matriz std cout lt lt Matriz dinamica destruida n tr gt Delete algorithmFiltered gt Delete celdas y puntos no hace falta triObject gt Delete cout lt lt Fin de AddObject n El m todo SetDataOfObjectInPiezasArray rellena un elemento del array PiezasArray y devuelve el indice en el array o 1 error int SetDataOfObjectInPiezasArray int VC Id char nombre vtkActor actor vtkTransformPolyDataFilt
22. objeto triangularizado y escalado Para obtenerlo basta utilizar el m todo GetFilterOfPiezasArray de la clase CollisionObjectFactory pas ndole como par metro el indice del array PiezasArray Ejemplo de creaci n de un objeto colisionable Veamos un ejemplo de c mo crear un objeto colisionable en este caso un cono Creacion un objeto CollisionObjectFactory CollisionObjectFactory COF new CollisionObjectFactory creacion de un cono en vtk vtkSphereSource cone vtkSphereSource New cone gt SetRadius 50 0 cone gt SetPhiResolution 100 cone gt SetThetaResolution 100 vtkActor coneActor int PA_id int id afiadir objeto al sistema de colisiones COF gt AddObject amp id cone 1 1 1 Organo coneActor amp PA_ id vtkPolyDataMapper coneMapper vtkPolyDataMapper New Si el objeto no fuera colisionable cone gt GetOutputPort coneMapper gt SetInputConnection cone gt GetOutputPort fd Para objeto colisionable obtenemos el filtro de COF coneMapper gt SetInputConnection COF gt GetFilterOfPiezasArray PA_id gt GetOutputPort coneActor vtkActor New coneActor gt SetMapper coneMapper coneActor gt GetProperty gt SetDiffuseColor 0 6 0 6 0 1 ren gt AddActor coneActor Las diferencias respecto a crear un objeto no colisionable son las siguientes l neas COF gt AddObject amp this gt id cone 1 1 1 Organo coneA
23. quir rgico es m s cr tico ya que un error puede producir severos da os en el paciente pudiendo llegar a provocar incluso su muerte Adem s el modelo actual de ense anza quir rgica es una ense anza por oportunidad es decir si un paciente tiene apendicitis los estudiantes pueden aprender aspectos t cnicos de la apendicetom a Con el uso de simuladores quir rgicos se pueden generar diferentes escenarios y adem s incrementando la complejidad de forma gradual De esta forma las intervenciones se pueden practicar de forma segura en un simulador antes de operar a un paciente La cirug a laparosc pica Las cirug as abdominales tradicionalmente han supuesto largas incisiones de tal forma que permitieran al cirujano tener un campo visual para realizar la operaci n Sin embargo este m todo ha contribuido significativamente a la lenta recuperaci n de los pacientes Los avances en cirug a han creado nuevas t cnicas y el material quir rgico adecuado para evitar los inconvenientes debidos a grandes incisiones dando lugar a la cirug a minimamente invasiva La cirug a minimamente invasiva reduce el tama o de la incisi n y la estancia en hospital de tal forma que los pacientes pueden volver a su actividad normal en un periodo de tiempo m s corto Los nuevos dispositivos permiten a los cirujanos realizar muchas operaciones sin el trauma y el dolor de las primeras t cnicas La cirug a laparosc pica es una t cnica media
24. triObject vtkTriangleFilter New triO0bject gt SetInputConnection algorithm gt GetOutputPort triO0bject gt SetPassLines 5 Escalamos vtkT Transform tr vtkTransform New tr gt Scale scaleX scaleY scaleZ 7 vtkTransformPolyDataFilter algorithmFiltered vtkTransformPolyDataFilter New algorithmFiltered gt SetInputConnection tri0bject gt GetOutputPort algorithmFiltered gt SetTransform tr para que getpoints no devuelva cero tri0bject gt Update algorithmFiltered gt Update vtkPoints puntos vtkPoints New puntos algorithmFiltered gt GetOutput gt GetPoints std cout lt lt matriz din mica de lt lt puntos gt GetNumberOfPoints lt lt puntos lt lt std endl creamos matriz dinamica para almacenar coordenadas de los puntos double matriz matriz new double puntos gt GetNumberOfPoints for int i 0 i lt puntos gt GetNumberOfPoints 1 matriz i new double 3 almacena las coordenadas de los puntos en la matriz dinamica for int i 0 i lt puntos gt GetNumberOfPoints i puntos gt GetPoint i matriz i crea un nuevo objeto VCollide y lo prepara para afiadirle triangulos vc NewObject id Despues de llamar a NewObject VCollide ya ha asignado un id int numObj id cout lt lt COF ha asignado para un nuevo objeto el id lt lt numObj lt
25. vectorial como a SQ a r n Cit 07 q 7 A 1s j k lt 3 Donde n es el n mero de tri ngulos p p u J q u 7 r w Cada uno de de ellos es un vector 3x1 p pj p3 p y Cik son los elementos de la matriz de covarianza 3x3 Los eigenvectores de una matriz sim trica como C son mutuamente ortogonales Despues de normalizarlos son utilizados como base Se encuentran los v rtices extremos a lo largo de cada eje de esta base Dos de los tres eigenvectores de la matriz de covarianza son los ejes de la m nima y m xima covarianza por lo que tender n a alinear la caja box con la geometr a de un tubo o de una superficie plana El punto d bil de la aproximaci n anterior es que los vertices en el interior del modelo que seguro no influyen en la selecci n de la localizaci n del Bounding Boz pueden tener un impacto arbitrario en los eigenvectores Por ejemplo una zona peque a pero muy densa y planar de vertices en el interior del modelo puede causar la alineaci n del bounding box con ella Para mejorar el algoritmo se utiliza el casco convexo de los v rtices de los tri ngulos El casco convexo es el conjunto convexo m s peque o que contiene todos los puntos y algoritmos eficientes de complejidad O n In n En consecuencia y para evitar un alineamiento incorrecto se integra sobre la superficie de cada triangulo de la zona infinitamente densa y permitiendo a cada diferencial contribuir a la matriz de
26. 30 40 d 60 m 80 30 ilo A eee ha Ex y zj Grid 10 0 a Auto Key Selected y eee an 5 uo fot QS E Click or click and drag to select objects SetKey JX KepFiters 10 Jo Bl gt 0 Adem s antes de exportar el objeto 3D como objeto wavefront para utilizar la pieza desde VTK deberemos posicionarla en el origen de coordenadas VTK soporta de forma muy sencilla la importaci n de archivos de tipo wavefront En el siguiente apartado se explica como realizar dicha tarea Desarrollo de c digo para simular la herramienta Una vez se tienen creadas las piezas que componen la herramienta en formato wavefront se ha de proceder al desarrollo de c digo En este proyecto el lenguaje de programaci n es C Como el modelado de una herramienta fija podr a considerarse una simplificaci n del modelo de una herramienta articulada se analizar primero la creaci n de una herramienta articulada para posteriormente analizar las diferencias Herramientas Articuladas Siguiendo con el ejemplo de las tijeras y teniendo en cuenta que se ha creado la clase Herramienta3D vamos a ver el c digo fuente de la clase Tijeras El primer punto a tener en cuenta es que la clase Tijeras hereda de la clase Herramienta3D La clase Herramienta3D proporciona m todos comunes para todas las herramientas para realizar operaciones como movimiento en azimuth y o elevaci n cargar el fichero OBJ para construir un actor VTK etc El pr
27. AnotherOrganos sirve para desactivar la colisi n entre el rgano cuyo ndice en PiezasArray se pasa como par metro y el resto de rganos Este otro m todo recorre PiezasArray en busca de rganos y desactiva la colisi n entre todos los que encuentre Actualizar la matriz de un ensamblado Las herramientas de laparoscopia se componen de una o m s piezas Un ensamblado es una agrupaci n de una o m s piezas por lo que las herramientas estar n formadas m nimo por un ensamblado Si se trata de una herramienta articulada tendr que estar formada por dos ensamblados un ensamblado principal y otro ensamblado para la pieza articulada Cada objeto en VTK tiene asociada una matriz 4x4 de transformaci n que representa de forma matem tica las transformaciones asociadas en los tres ejes rotaci n traslaci n y escalado Realmente Vcollide no soporta escalado el escalado se realiza en el m todo AddObject antes de a adir el objeto al sistema de colisiones por lo que las transformaciones a las que haremos referencia a partir de ahora ser n rotaci n y traslaci n Cuando realicemos una operaci n de movimiento ya sea de tipo rotacional o traslacional sobre un objeto 3D colisionable tenemos que actualizar las matrices de transformaci n de los objetos ensamblados que componen dicho objeto Para actualizar las matrices de transformaci n de los actores que componen una herramienta la clase CollisionObjectFactory dispone de dos m tod
28. TACTS VCollide Collide was called with VC_ FIRST CONTACT then numTriPairs always returns 0 Error may occur if obj pair num is out of range trilID int obj pair num int tri pair num Re turns the ID of the first triangle in the specified triangle pair This triangle belongs to the first object in specified object pair Used only if VCollide Collide was called with VC_ ALL CONTACTS Error may occur if obj pair num or tri pair num is out of range tri pair num ranges from 0 to 1 less than the number of triangle pairs int tri2ID int obj pair num int tri pair num Returns the ID of the second triangle in the specified triangle pair This triangle belongs to the second object in the specified object pair Used only if VCollide Collide was called with VC_ ALL CONTACTS Error may occur if obj pair num or tri pair num is out of range OVERVIEW V Collide is a library that provides fast exact collision detection and may be useful for virtual reality and a variety of other simulations applications It assumes that you have a model that may be broken down into a set of objects These objects typically undergo some rigid body motions and are periodically tested for collision For each simulation time step the V Collide library will report which pairs of objects are currently in contact You are free to specify exactly which pairs of objects should be tested for co
29. UNIVERSIDAD MIGUEL HERN NDEZ DE ELCHE ESCUELA POLIT CNICA SUPERIOR DE ELCHE INGENIER A DE TELECOMUNICACI N UNIVERSITAS E E Z x a S y N SIMULADOR H PTICO PARA ENTRENAMIENTO DE T CNICAS DE LAPAROSCOPIA PROYECTO FIN DE CARRERA Junio 2008 AUTOR Daniel Ivorra Ruiz DIRECTOR ES Jos Mar a Sabater Navarro VISTO BUENO Y CALIFICACI N DEL PROYECTO T tulo proyecto Simulador h ptico para entrenamiento de t cnicas de laparoscopia Proyectante Daniel Ivorra Ruiz Director es Jos Maria Sabater Navarro V B director es del proyecto Fdo Jos Maria Sabater Navarro Lugar y fecha CALIFICACION NUMERICA A MATR CULA DE HONOR M ritos justificativos en el caso de conceder Matr cula de Honor Conforme presidente Conforme secretario Conforme vocal Lugar y fecha ndice o AAA erode seamen ne raaaa seta a 6 Resumen aeaaea sits A GA A ees 7 Capitulo 1 Introducci n a la simulaci n de t cnicas quir rgicas coooooonncccioccconcconncconocannninnnos 8 La Cir Gia JaparosCopICA as iia 9 Problema general de la simulaci n ti 12 Estado del arte de la simulaci n QUIT T8ICA ooooocnoccconocococoonnconncconocnnn cono cono noconocnnnnnncconncns 13 Requisitos del simulador de laparoscopia ooooooccnococonocococononcnnnoconoconn cono conocio cono cnnnnonnnconncnn 14 Cap tulo 2 Modelado de herramientas para laparoscopia ooooonnoccnoncconocononconncconocannc
30. Veamos un ejemplo de c mo crear un objeto colisionable en este caso un cono Creacion un objeto CollisionObjectFactory CollisionObjectFactory COF new CollisionObjectFactory creacion de un cono en vtk vtkSphereSource cone vtkSphereSource New cone gt SetRadius 50 0 cone gt SetPhiResolution 100 cone gt SetThetaResolution 100 vtkActor coneActor int PA_id int id a adir objeto al sistema de colisiones COF gt AddObject amp id cone 1 1 1 Organo coneActor sPA id vtkPolyDataMapper coneMapper vtkPolyDataMapper New Si el objeto no fuera colisionable cone gt GetOutputPort coneMapper gt SetInputConnection cone gt GetOutputPort fe Para objeto colisionable obtenemos el filtro de COF coneMapper gt SetInputConnection COF gt GetFilterOfPiezasArray PA_id gt GetOutputPort coneActor vtkActor New coneActor gt SetMapper coneMapper coneActor gt GetProperty gt SetDiffuseColor 0 6 0 6 0 1 ren gt AddActor coneActor Las diferencias respecto a crear un objeto no colisionable son las siguientes l neas COF gt AddObject amp this gt id cone 1 1 1 Organo coneActor s PA id coneMapper gt SetInputConnection COF gt GetFilterOfPiezasArray PA_id gt GetOutputPort donde id y PA_id son variables tipo Int que sirven para identificar al objeto en VCollide y en el sistema de colisiones CollisionObjectFac
31. aci n en forma de garfio etc e Implementaci n de nuevas herramientas para el aprendizaje borrador regla etc e Ejercicios de simulaci n diferentes al de grapado a lo largo de una trayectoria como por ejemplo ejercicios de penetraci n ejercicios de agarre etc e Ejercicios evaluativos estad sticos de la precisi n y del nivel de objetivos alcanzados e Integraci n de las herramientas de laparoscopia con dispositivos h pticos e Estudio para la optimizaci n de colisiones e Simulaci n de la gravedad Por otro lado para otros proyectos que necesiten la creaci n de nuevos objetos en VTK su manipulaci n o que necesiten integrar un sistema de detecci n de colisiones tambien les puede ser de gran utilidad consultar la documentaci n y o el c digo fuente de este proyecto as como los anexos ANEXOS Anexo A Configuraci n del entorno para depurar A continuaci n se muestra una minigu a de gran utilidad para instalar un entorno de trabajo con QT VTK y Visual Studio 2005 en un equipo con sistema operativo Windows XP El ltimo paso explica brevemente c mo instalar las librer as V Collide La informaci n mostrada a continuaci n surge de mi propia experiencia muchas horas de intentar que el conjunto de aplicaciones funcionara y de las siguientes URLs http qtnode net wiki Qt4 with Visual Studio http code hkpeterpeter googlepages com vtk build vc pdf Las URLs anteriores incluyen enlaces para la descarga
32. ado gt AddPart this gt ActorsArray 0 centro this gt Ensamblado gt GetCenter this gt Ensamblado gt SetOrigin centro 0 0 0 this gt Ensamblado gt AddPart this gt ActorsArray 1 this gt Ensamblado gt SetPosition posx 100 centro 1 2 500 En el caso del cutter se compone de dos actores Cutter Filo de cutter Cutter es el objeto numero cero de esta herramienta se utiliza como objeto visible y colisionable con el entorno Son las colisiones de este objeto las que limitan el movimiento del cutter Si este objeto colisiona realizando un movimiento en una determinada direcci n se deshace dicho movimiento sin llegar a visualizarse por pantalla En cuanto a Filo de cutter se establece su visibilidad a cero this gt ActorVisibilityArray 1 0 Al establecer esta propiedad sus colisiones no afectan al movimiento de la herramienta en este sentido se trata como si fuera un objeto invisible Sin embargo su colisi n importa ya que para que el cutter haga sangrar un rgano lo que se est haciendo realmente es pintar de rojo los pol gonos colisionados del rgano con este objeto invisible Al haberse dise ado como una funda del filo del cutter se consigue el efecto de una ligera penetraci n en el objeto como si cortara A continuaci n en la siguiente imagen se aprecian ambos objetos El objeto Filo de Cutter se ha separado una distancia a lo largo del eje X para poder diferen
33. anismos intermedios representan todos los componentes mec nicos necesarios para que funcione la grapadora es decir los mecanismos que se encargan de recibir la acci n de entrada y transformarla en una acci n de salida til En el ejemplo de la grapadora la entrada se realiza a trav s de la palanca de accionamiento y es transmitida al armaz n del engranaje a trav s del linguete de trinquete y despu s al mango de accionamiento antes de que las funciones de salida de grapar expulsar las grapas y suturar puedan ser realizadas por la unidad de carga desechable Disposable loading unit Esta herramienta se utiliza en operaciones de laparoscopia en las que se necesita eliminar una secci n enferma La herramienta se utiliza en un extremo del rgano aplicando filas paralelas de grapas al tejido para que deje de sangrar mientras una cuchilla ir cortando el tejido u rgano entre las filas de grapas A continuaci n el instrumento se recarga con un nuevo cartucho de grapas Se aplica entonces al otro extremo del tejido u rgano para que la secci n enferma est totalmente diseccionada y los extremos restantes del rgano permanecen sellados Para retirar la secci n enferma del rgano se utiliza otra herramienta En cuanto a las acciones de salida de las herramientas de laparoscopia un ejemplo de las m s comunes son rotar virar sujetar expulsar o eyectar grapar y cortar Muchas de ellas son dise adas en una nica herramienta por ej
34. ar ALL_BUILD project y Build Seleccionar INSTALL project y Build Por defecto se instala en c Archivos de Programa VTK Tools gt Options gt Projects and Solutions gt VC directories desde Visual Studio 2005 C Archivos de programa VTK include vtk 5 0 en include files C Archivos de programa VTK lib en library files Paso 4 Instalaci n de V Collide A continuaci n se explica brevemente los pasos para instalar V Collide Descargar y descomprimir V Collide Puede descargarse gratuitamente de http www cs unc edu geom V_COLLIDE request html Abrir Vcollide dsw con Visual Studio 2005 y seguir los pasos para convertir a sIn En Vinternal c cambiar iostream h por iostream Hacer lo mismo con PairData c y Nbody c En Vcollide Rapid Rapid_private h existe una declaraci n friend RAPID _Collide A adir la palabra int entre friend y RAPID_Collide Por ltimo hay que a adir los directorios include y lib de Vcollide al IDE Visual Studio Para finalizar muestro unas capturas de la configuraci n de Visual Studio Options Environment Platform Show directories for Projects and Solutions Wwin32 Include files v General Build and Run d c x _ y CuArchivos de programalWTKlinclude wtk S 0 C Project Settings C RAPIDZ01 Source Control C Collide20 1 include Text Editor r ie Tool V CInstallDirjinclude si ae Sa YCInstallDir atlmfciinciude Debugging CInstallDir PlatFo
35. blado this gt Ensamblado2 this gt ActorsVCIdArray this gt TransformArray void Herramienta3D CreateDynamicArrays int number this gt GetNumberOfActors if number 0 this gt ActorsArray new vtkActor number this gt TransformArray new vtkTransform number for int 3 0 j lt number j this gt ActorsArray j vtkActor New this gt TransformArray j vtkTransform New this gt ActorsVCIdArray new int number this gt ActorsPAIdArray new int number this gt ActorVisibilityArray new int number void Herramienta3D DeleteDynamicArrays int number this gt GetNumberOfActors if number 0 for int 3 0 j lt number j ActorsArray j gt Delete TransformArray j gt Delete delete this gt ActorsArray delete this gt TransformArray delete this gt ActorsVCIdArray delete this gt ActorsPAldArray delete this gt ActorVisibilityArray void Herramienta3D RotateXYZAssembly float x float y float z Rota el ensamblado principal this gt Ensamblado gt RotateY y this gt Ensamblado gt RotatexX x Actualiza las matrices de los actores que componen el los ensamblado s if this gt GetNumberOfAssemblies 1 this gt OCF gt UpdateAssemblyMatrix this gt GetNumberOfAssemblies this gt Ensamblado this gt ActorsVCIdArray this gt TransformArray
36. cen mensajes de car cter informativo ERE Constructor CollisionObjectFactory Constructor de organo construyendo esfera COF ha asignado para un nuevo objeto el id SetData0fObjectInPiezasArray UC_Id B 5 nombre 0rgano Esfera PA_index COF ha asignado para un nuevo objeto el id interno Fin de AddObject Constructor Herramienta3D Constructor de pinza COF ha asignado para un nuevo objeto el id 1 SetData0fObjectInPiezasArray UC_Id 15 nombre Pinzai PA_index 1 COF ha asignado para un nuevo objeto el id interno 1 Fin de AddObject COF ha asignado para un nuevo objeto el id 2 SetData0fObjectInPiezasArray UC_Id 2 nombre Pinza2 PA_index 2 COF ha asignado para un nuevo objeto el id interno 2 Fin de AddObject COF ha asignado para un nuevo objeto el id 3 SetData0fObjectInPiezas Array UC_Id 35 nombre Pinza transparente 1 PA_index 3 COF ha asignado para un nuevo objeto el id interno 3 Fin de AddObject COF ha asignado para un nuevo objeto el id 4 SetData0fObjectInPiezasArray UC_Id 4 nombre Pinza Transparente 2 PA_index 4 COF ha asignado para un nuevo objeto el id interno 4 Fin de AddObject Herramientas software Las herramientas que se han modelado en la aplicaci n son las siguientes Lapiz Cutter Tijeras Pinzas Grapadora El lapiz se trata de una herramienta fija que cuando entra en contacto su punta con un rgano lo pinta de color azul En la siguiente imagen se observa dicho comportami
37. ci n con un sistema de detecci n de colisiones que posibilite la implementaci n del simulador de laparoscopia Cap tulo 1 Introducci n a la simulaci n de t cnicas quir rgicas Los avances que ha sufrido el campo de la tecnolog a de la informaci n y dentro del mismo la Inform tica Gr fica ha permitido el comienzo de la investigaci n y desarrollo de simuladores virtuales para el entrenamiento de especialistas Uno de las principales aplicaciones de estos avances es la creaci n de Simuladores Quir rgicos Este tipo de simuladores se caracteriza por sus grandes exigencias tanto visual como del sentido del tacto sentidos fundamentales en cirug a Para conseguir el realismo visual los rganos presentes en el simulador se han de mostrar lo m s similarmente posible a como se observan en la realidad y han de responder en tiempo real al menos 15 veces por segundo a las interacciones del usuario Respecto al realismo en el sentido del tacto dada la elevada resoluci n que el ser humano posee en este sentido el usuario del simulador precisa de una frecuencia de refresco de este sentido de al menos 500 veces por segundo Actualmente los grupos de investigaci n est n dedicando grandes esfuerzos en conseguir alcanzar estos objetivos de realismo con el prop sito de obtener una herramienta extremadamente potente que revolucione la docencia la pr ctica y la difusi n de las t cnicas quir rgicas La simulaci n de t cnicas quir
38. ciarlos En la siguiente imagen se observa en detalle la vista Left donde se puede comprobar que Filo de Cutter sobresale por encima de las dimensiones de Cutter Este es el motivo por el que se consigue el efecto de ligera penetraci n en el rgano El objeto Filo de cutter es lo que en comentarios del c digo anterior aparece como objeto invisible La finalidad de este objeto invisible en el caso del Cutter como se coment previamente es la siguiente al colisionar con un rgano si se hace clic con el bot n izquierdo del rat n los pol gonos intersectados del rgano se pintan de rojo simulando as la sangre A continuaci n se muestra el c digo fuente del m todo clicIzq el encargado de pintar B sicamente lo que hace este m todo es comprobar si ha habido colisi n entre el objeto invisible y alg n rgano void Cutter clicIzq this gt OCF gt InformAboutCollisions obtiene el id del organo colisionado int organo PA Id this gt OCF gt GetOrganoCollisionedWithHerramienta this gt ActorsVCIdArray 1 comprueba si ha colisionado el objeto invisible y si ademas ha colisionado con un organo if this gt OCF gt HasCollisioned this gt ActorsvClidArray 1 amp amp organo_ PA Id 1 tiene que pintar int numCeldas scalars vtkUnsignedCharArray SafeDownCast this gt OCF gt GetFilterOfPiezasArray organo PA Id gt GetOutput gt GetCellData gt GetScalars if scalar
39. cos theta loat z r sin theta cos phi this gt AddPositionXYZ x y Z STATE COUE lt lt XYZ lt lt lt LL EE ME MEL ta renal rh Fh Fh Fh ct PhO void Herramienta3D AddPositionXYZ float x float y float z obtenemos el numero d nsamblados que componen la herramienta int numAssemblies this gt GetNumberOfAssemblies hace avanzar o retroceder el ensamblado this gt Ensamblado gt AddPosition x y z actualiza las matrices del ensamblado en VCollide if numAssemblies 1 this gt OCF gt UpdateAssemblyMatrix this gt GetNumberO0fAssemblies this gt Ensamblado this gt ActorsVCIdArray this gt TransformArray else this gt OCF gt UpdateAssembliesMatrices this gt Ensamblado this gt Ensamblado2 this gt ActorsVCIdArray this gt TransformArray si ha chocado revierte la operacion int colision this gt AnyActorVisibleHasCollisioned si hay colision de cualquier actor NO INVISIBLE se revierte la operacion if colision 1 cout lt lt Deshaciendo movimiento n this gt clicIzq this gt Ensamblado gt AddPosition x y 2Z actualiza las matrices del ensamblado en VCollide if numAssemblies 1 this gt OCF gt UpdateAssemblyMatrix this gt GetNumberOfAssemblies this gt Ensamblado this gt ActorsVCIdArray this gt TransformArray else this gt OCF gt UpdateAssembliesMatrices this gt Ensam
40. ctor s PA id coneMapper gt SetInputConnection COF gt GetFilterO0fPiezasArray PA id gt GetOutputPort donde id y PA_id son variables tipo Int que sirven para identificar al objeto en VCollide y en el sistema de colisiones CollisionObjectFactory respectivamente Estas variables no hay que inicializarlas ya que es dentro del propio m todo AddObject desde donde se les asignar valor El m todo AddObject se encarga de procesar el objeto triangularizar y escalar antes de a adir al sistema de colisiones y de guardar el filtro con el procesamiento realizado void AddObject int id vtkAlgorithm algorithm double scaleX double scaleY double scaleZ char nombre vtkActor actor int PA indice Para recuperar el filtro utilizaremos el m todo GetFilterOfPiezasArray vtkTransformPolyDataFilter GetFilterOfPiezasArray int PA index return this gt PiezasArray PA index filtro El m todo AddObject void CollisionObjectFactory AddObject int id vtkAlgorithm algorithm double scaleX double scaleY double scaleZ char nombre vtkActor actor int PA indice Para afiadir un objeto al sistema de colisiones VCollide hay que tener en cuenta dos consideraciones 1 Triangularizar 2 No soporta escalado por lo que el escalado debe hacerse EL a priori utilizando vtkTransformPolyDataFilter std cout lt lt A adiendo objeto al sistema de colisiones n Triangularizamos vtkTriangleFilter
41. da y derecha Estos movimientos se controlan mediante dos medios diferentes la palanca de control control lever y el collar de rotaci n rotation collar Este ltimo se utiliza para un movimiento rotacional y el primero para un movimiento a izquierda y derecha Rotation collar Control lever Elongated body Rotate Fig 8 Instrument s maneuverability 5 La siguiente figura muestra una vista de un corte de secci n lateral de la mand bula superior de una grapadora quir rgica que est sujetando el tejido mientras las grapas est n 20 despleg ndose desde el cartucho En ella se pueden ver las grapas en su forma parcialmente formada y final Partially formed staple Upper jaw ree aa Y Fully formed staple AN 003 SS NA Sar Clamped gt R tissue Staple cartridge Fig 9 Distal end during clamping and stapling 9 Algunas herramientas de grapado quir rgicas tienen la habilidad de cortar el tejido despu s de aplicar las grapas al tejido En la siguiente figura se puede apreciar un cartucho de grapas con un hueco longitudinal para recibir una cuchilla Blade slot Staple cartridge Blade Fig 10 Tissue cutting 15 Para cumplir con su funcionalidad las herramientas de laparoscopia utilizan componentes mec nicos convencionales como cables poleas muelles etc A modo de ejemplo las siguientes figuras muestran los componentes internos d
42. de tal forma que las piezas pueden moverse mediante un movimiento relativo controlado Muchas herramientas de laparoscopia son muy complejas y tienen multiples componentes mec nicos interactuando Estas herramientas cada vez son m s complejas con el objetivo de conseguir m s funciones de salida a partir de una sencilla acci n de entrada Es debido a esta complejidad en los mecanismos de ensamblado que se incrementa el coste de fabricaci n a causa de tener m s partes y del tiempo empleado en conseguir un dise o apropiado 15 Ultrasound transducer through epigastric port Trocar Laparoscopic instruments Para caracterizar una herramienta de laparoscopia podemos fijarnos en los diferentes atributos del sistema mec nico entrada mecanismos intermedios salidas dise o y activaci n La entrada representa el m todo que empleamos para activar el instrumento y puede ser de fuerza autocontenida o manual Autocontenida describe un instrumento que tiene su propia fuente de energ a para accionar el dispositivo mientras manual hace referencia a las manos del cirujano como origen de la fuerza Las entradas y salidas no est n directamente conectadas Por ejemplo en la grapadora quir rgica de la siguiente imagen los mecanismos dentro de la empu adura son componentes del mecanismo intermedio 16 Handle assembly gt gt Disposable loading unit Fig 2 Laparoscopic surgical stapler 8 Los mec
43. del sistema de colisiones se utiliza el m todo DeleteObject pas ndole de par metro el PA index es decir el identificador del objeto en PiezasArray Desactivar la colisi n entre un par de objetos En ocasiones se desea que un objeto colisionable no sea colisionable con alg n otro objeto Por ejemplo si disponemos de una herramienta Lapiz que se componga de dos piezas el palo y la punta Podemos desear que tanto el palo como la punta sean objetos colisionables y que se detecte su colisi n con otras herramientas o con rganos pero nunca entre ellos Para desactivar la colisi n entre pares de objetos se han desarrollado dos m todos DeactivateCollision y DeactivateCollisionWithAnotherOrganos El m todo DeactivateCollision sirve para desactivar la colisi n entre dos piezas a partir de los nombres con los que han sido a adidos al sistema de colisiones Por ejemplo si hemos a adido una herramienta l piz que se compone de dos objetos en el sistema de colisiones cuyos nombres son palo y punta respectivamente para desactivar la colisi n entre ambos char objectsNameArray palo punta Desactiva colisiones this gt OCF gt DeactivateCollision objectsNameArray 0 objectsNameArray 1 Este m todo recorre PiezasArray para obtener los identificadores de ambas piezas en Vcollide y desactivar su colisi n mediante el m todo DeactivatePair de la librer a Veollide Por otro lado el m todo DeactivateCollisionWith
44. der piezaOBJ vtkPolyDataMapper auxMapper char file int componentsNumber 4 char objectsNameArray Cilindro Estera Tizjeral Tijera2 double scaleX 1 double scaleY 4 double scaleZ 1 double longTubo longEsfera Declaraciones file new char componentsNumber file 0 C vtkdata Data Viewpoint cilindro obj file 1 C vtkdata Data Viewpoint esfera obj file 2 C vtkdata Data Viewpoint tijeral obj file 3 C vtkdata Data Viewpoint tijera2 obj Creamos los mappers auxMapper new vtkPolyDataMapper componentsNumber for int i 0 i lt componentsNumber i auxMapper i vtkPolyDataMapper New Asociamos el COF this gt OCF factory la posici n puede ser derecha o izquierda if izq 1 posx 100 else posx 100 Establecemos el n mero de actores y de ensamblados this gt SetNumberOfActors componentsNumber this gt SetNumberOfAssemblies 2 establecemos las diferentes acciones asociadas a clic del raton this gt AddAction rotar this gt AddAction abrir Reservamos memoria para los actores e identificadores this gt CreateDynamicArrays Establecemos la visibilidad invisibilidad de los actores this gt ActorVisibilityArray 0 1 this gt ActorVisibilityArray 1 1 this gt ActorVisibilityArray 2 1 this gt ActorVisibilityArray 3 1 leer archivo OBJ de ac
45. e la Universidad Miguel Hern ndez de Elche como por la amabilidad de los profesores si alguien me pidiera su opini n sobre si es o no aconsable realizar el proyecto con este departamento sin duda la respuesta es s Como punto final de este apartado se presentan las caracter sticas actuales del simulador permite utilizar m s de un organo en el escenario permite utilizar dos herramientas una situada en la derecha y otra situada en la izquierda del escenario Detecci n de colisiones entre 6rganos herramientas y herramienta herramienta Permite pintar sobre un rgano Permite la colocaci n de grapas orientadas seg n la direcci n de la grapadora Permite movimiento en azimuth y elevaci n de las herramientas Permite articular movimientos rotacionales de las herramientas Permite articular movimientos de apertura cierre de pinzas Permite la simulaci n de grapado a trav s de una trayectoria previamente definida Trabajo Futuro Aunque este proyecto cierra una etapa importante de mi carrera desde luego de lo que no hay lugar a dudas es que dentro de la rama m dica en la que se ha elaborado el proyecto abre paso a una gran cantidad de proyectos Posibles ideas o trabajos a seguir tomando de base este proyecto podr an tratar sobre e Implementaci n de rganos deformables e Implementaci n de nuevas herramientas de laparoscopia como por ejemplo herramientas de sutura o herramientas de cauteriz
46. e dos grapadoras 21 Mechanical slide First linkage 7 Second linkage A AN a Handle s base Closure trigger LY Fig 15 A linkage solution 13 Dial knob Cables Pulley Sraple cartridge assembly Fig 17 Cables and pulley 4 22 Modelado de herramientas tipo A punteros con mu eca articulada y fijas Las principales herramientas de tipo A son las herramientas de cauterizaci n En la figura siguiente se muestran dos herramientas de este tipo una en forma de gancho y la otra en forma de esp tula Permanent Cautery Spatula 400184 En este proyecto se ha dise ado una herramienta l piz que se podr a utilizar tanto como de l piz como de herramienta de cauterizaci n Se trata de una modelo sencillo compuesto de un tubo y de una semiesfera alargada tal y como se puede apreciar en la siguiente figura El objeto que aparece en la punta de la herramienta es un cubo y se puede utilizar como zona de interacci n de la herramienta Por ejemplo para cauterizar s lo a trav s de la punta Es un t rmino medico usado para describir la quemadura del cuerpo usada para remover una parte de l o para sellar vasos sangu neos 23 Archivo 24 Organo Herramienta Der Herramienta Izq Modelado de herramientas tipo B pinzas con mu eca articulada y fijas Se entiende por herramientas de tipo B aquellas que en su extremo tienen dos componentes como por ejemplo tijeras p
47. ed as a 4x4 matrix formulated to be multiplied to the left of a column vector during the transformation This matrix should be a rigid body transformation rotation and translation When an object is first created it has the identity matrix as its transformation PERFORMING THE COLLISION TEST When all the objects transformations have been modified as necessary and the activation state is properly set call Collide to perform the collision testing for the current time step Collide can be called with argument VC FIRST CONTACT default or VC_ALL CONTACTS With VC_FIRST CONTACT Collide will only detect the first contact between each pair of objects and report which pairs of objects are currently in contact With VC_ALL CONTACTS Collide will detect all the contacts between each pair of objects and report in addition to what you can get with VC_FIRST CONTACT which triangles are intersecting between each pair of intersecting objects GETTING REPORTS After calling Collide with the address of a VCReport object the VCReport object will be filled with the collision results and the results can be read using the VCReport s functions RETURN VALUES Most operations Called on a VCollide engine return an integer success code VC_ OK on success or an appropriate error code on failure These codes are defined in VCollide H Return values should be checked reg
48. el m todo AddPositionXYZ El resto de m todos son utilizados por los propios m todos de la clase o clases hijas y son utilizados para diferentes tareas como inicializaci n destrucci n de objetos para saber si ha colisionado alg n objeto visible para controlar la acci n asociada a la pulsaci n de una tecla o para la lectura de un fichero wavefront A continuaci n se muestra el c digo fuente de la clase Herramienta3D include Herramienta3D h Herramienta3D Herramienta3D void std cout lt lt Constructor Herramienta3D n this gt tr vtkTransform New this gt SetAnguloRotadoAzimuth 0 0 this gt SetAnguloRotadoElevacion 0 0 this gt SetAnguloRotadoAbertura 7 0 this gt SetNumberOfAssemblies 1 this gt OCF NULL this gt SetNumberOfActors 0 this gt actionsArray 0 NU this gt actionsArray 1 NU this gt actionsArray 2 NULL inicializamos el iterador de acciones clic izqdo this gt actionsArraylterator 0 comprueba max y minimos this gt comprobarAngulo true oe r e r Herramienta3D Herramienta3D void std cout lt lt Destructor Herramienta3D n this gt DeleteDynamicArrays tr gt Delete void Herramienta3D AddAction char accion for int i 0 i lt 3 it if this gt actionsArray i NULL this gt actionsArray 1i accion cout lt lt La accion lt lt i lt lt di sta Herramienta es lt lt action
49. emplo en la grapadora por razones ergon micas para que los cirujanos puedan sin esfuerzo utilizar la herramienta en una 17 posici n c moda Por ejemplo para dirigir la grapadora hacia la localizaci n donde tiene que grapar el tejido el cirujano puede utilizar la capacidad de viraje y rotaci n Como parte de la operaci n el instrumento debe sujetar el tejido para despu s grapar los tejidos las partes superior e inferior del tejido y cortar entre las grapas esto s lo en algunas herramientas Para realizar estas funciones las herramientas disponen de ciertos mecanismos en los que no vamos a entrar en detalle A modo de ejemplo las tareas de sujetar expulsar las grapas y el cortar el tejido se realizan simult neamente por un tornillo mecanizado y un deslizador mec nico conectados con un motor el ctrico La siguiente figura representa una herramienta dotada de motor el ctrico con su propia fuente de energ a pilas para activar el ensamblado del motor Cuando se acciona el gatillo el engranaje motorizado se activa actuando a su vez sobre un engranaje axial sujetado sobre un mecanismo que aplicar las grapas sobre el tejido Gear train Electric motor Trigger Batteries Fig 4 Electric motor powered 14 En cuanto a la activaci n se entiende por activaci n al control del movimiento de entrada requerido para conseguir las funciones de salida deseadas En herramientas de energ a autocontenida los cirujano
50. ento Archivo Organo Herramienta Der Herramienta Izq Para mover el lapiz por el entorno se utiliza el movimiento del rat n Para avanzar o retroceder en profundidad se utiliza la rueda del rat n El cutter es parecido al lapiz aunque para pintar no s lo tiene que colisionar sino que adem s el usuario tiene que hacer clic en el bot n izquierdo del rat n Archivo Organo Herramienta Der Herramienta Izq Las tijeras son una herramienta articulada que permite rotar sobre su eje abrir y cerrar las tijeras Por tanto cabe distinguir dos acciones rotar y abrir cerrar Para cambiar de acci n se tiene que pulsar a Para realizar la acci n en un sentido se ha de hacer clic en el bot n izquierdo del rat n Para realizar la acci n en sentido opuesto se ha de hacer clic en el bot n derecho W Simulador H ptico para entrenamiento de t cnicas de Laparoscopia Archivo Organo Herramienta Der Herramienta Izq Las pinzas son una herramienta fija que permite abrir y cerrar las pinzas con los botones izquierdo y derecho del rat n respectivamente Archivo Organo Herramienta Der Herramienta Izq La grapadora es una herramienta articulada que permite rotar sobre su eje abrir y cerrar las pinzas y grapar Por tanto cabe distinguir tres acciones rotar abrir cerrar y grapar Para cambiar de acci n se tiene que pulsar a Para realizar la acci n en un sentido se ha de hacer clic en el bot n izquierdo del rat n
51. er int posx this gt OCF factory la posici n puede ser derecha o izquierda if izq 1 posx 100 else posx 100 this gt SetNumberOfActors 2 Reservamos memoria para los actores e identificadores this gt CreateDynamicArrays Par metros para escalado scaleX 1 scaleY 3 scaleZ 1 Establecemos la visibilidad invisibilidad de los actores this gt ActorVisibilityArray 0 1 this gt ActorVisibilityArray 1 0 leer archivo OBJ de actores visibles y a adirlos al sistema de colisiones file C vtkdata Data Viewpoint cuchillo obj objectName CUTTER piezaOBJ this gt ReadOBJFile file this gt OCF gt AddObject amp this gt ActorsVCIdArray 0 piezaOBJ scaleX scaleY scaleZ objectName this gt ActorsArray 0 amp this gt ActorsPAIdArray 0 piezaOBJ gt Delete Mapper y Actor para cuchillo auxMapper vtkPolyDataMapper New auxMapper gt SetInputConnection this gt OCF gt GetFilterOfPiezasArray this gt ActorsPAIdArray 0 gt GetOutputPort this gt ActorsArray 0 gt SetMapper auxMapper obtenemos la longitud del cuchillo double lapizY this gt ActorsArray 0 gt GetYRange double longCutter lapizY 1 lapizY 0 centro this gt ActorsArray 0 gt GetCenter quiero que el centro de las rotaciones sea la base del lapiz this gt ActorsArray 0 gt SetOrigin centro 0 0 centro 2 this gt ActorsArra
52. er filtro Por ltimo destacar que V Collide no entiende de distancias simplemente detecta si hay o no colisi n En el caso de colision para saber qu tri ngulos han colisionado es muy importante el buen conocimiento de la clase VCReport de VCollide La clase VCReport consta de los siguientes m todos int num0bjPairs N mero de pares de objetos en contacto int objlID int obj pair num ID del primer objeto especificado en el par de objetos int obj2ID int obj pair num ID del segundo objeto especificado en el par de objetos int numTriPairs int obj pair num Devuelv 1 n mero de pares d tri ngulos que est n en contacto entre los pares de objetos especificados til s lo cuando se llama a Vcollide Collide con VC_ ALL CONTACTS int trilID int obj pair num int ID del primer tri ngulo en el par tri pair num de tri ngulos especificado Tri pair num va desde 0 hasta el n mero de pares de tri ngulos 1 int tri2ID int obj pair num int ID del segundo tri ngulo en el par tri pair num de tri ngulos especificado Tri pair num va desde 0 hasta el n mero de pares de tri ngulos 1 A modo de ejemplo el siguiente c digo se utiliza por la herramienta Cutter para obtener qu tri ngulos tiene que colorear void Cutter cliclzq this gt OCF gt InformAboutCollisions obtiene el id del organo colisionado int organo PA Id this g
53. er este algoritmo facilitar su comprensi n Marching Squares permite dibujar l neas entre los valores interpolados a lo largo de los ejes de una superficie considerando los valores de las esquinas como valores de referencia Consideremos una malla 2D como la que se muestra en el siguiente dibujo Cada punto de la malla tiene un peso En la imagen el valor de referencia es de 5 Para dibujar la curva cuyo valor es constante e igual al de referencia es posible utilizar diferentes clases de interpolacion El m todo m s utilizado es la interpolaci n lineal Con el objetivo de dibujar esta curva es posible utilizar diferentes metodos de los cuales el principal o mas conocido consiste en considerar individualmente cada superficie de la malla Este es conocido como el metodo marching square Para este m todo se establecen 16 configuraciones que permiten la representacion de todas las clases de lineas en un espacio bidimensional LA Case 0 Case 2 Case3 Cased4 Case 5 Case 6 Case 7 NH Case 8 Case9 Case l0 Case ll Casel2 Casel3 Case 14 Case 15 Cuando se analiza este algoritmo en diferentes configuraciones se aprecia que pueden aparecer casos ambiguos como el mostrado en la figura siguiente Break contour Join contour Como se aprecia en la imagen superior no es posible tomar una decision determinista de esta clase de situacion Ejemplo de construcci n de una isosuperficie El primer paso consiste en calcula
54. es reducir el n mero de pol gonos adem s de proporcionar una gran variedad de clases de datos para trabajar datos poligonales im genes vol menes mallas 28 Algoritmo de reconstrucci n 3D utilizado marching cubes Creaci n de modelos 3D Para la creacion de modelos 3D a partir de datos volum tricos se ha optado en la mayor a de los casos por un sistema manual utilizando procesamiento de im genes Este proceso puede ser muy lento adem s de requerir conocimientos de tipo medico y mucha experiencia Por razones obvias es preferible contar con un proceso de segmentacion autom tica que permita la reconstruccion del modelo 3D de forma rapida y con la mayor precision En el caso de determinadas partes del cuerpo como pueden ser los huesos o la piel el cambio de intensidad en las imagens es tan claro que permite utilizar tecnicas de reconstruccion de superficies tipo Marching Cubes con resultados pimos Este tipo de tecnicas tiene problemas en el caso de estar interesado en organos o tejidos blandos como podr an ser el coraz n el higado o los m sculos debido a que las im genes correspondientes a estos Organos suelen presentar contornos muy poco definidos que se confunden con el entorno Introducci n a Marching Cubes Un caso especial de renderizaci n de vol menes lo constituyen los Marching Cubes El objetivo de esta t cnica es generar el mallado triangular de la superficie externa del objeto 3D contenido
55. eto en los ejes X Y y Z respectivamente Los posibles valores que pueden tomar estos par metros de escalado son e 1 indica que no hay escalado e O lt x lt l indica una reducci n del tama o e gt l indica que un aumento del tama o El par metro nombre Sirve para asignar un nombre a la pieza colisionable El par metro actor El actor que representa a la pieza colisionable El par metro PA indice Indice del array PiezaArray Para llevar el control de los objetos colisionables que se est n utilizando en la aplicaci n se ha creado un Array din mico de tama o TAM_MAX PIEZAS ARRAY PiezasArray de ah el primer t rmino de este par metro PA De igual forma que el par metro id el valor del ndice se asignar desde el propio m todo AddObject Array con informaci n sobre las piezas a adidas al sistema de colisiones ObjectInfo PiezasArray Structura de datos sobre cada objeto pieza del sistema de colisiones struct ObjectiInfo int VC Id ID en VCollide char nombre 50 Nombre de la pieza vtkActor actor actor correspondiente a la pieza vtkTransformPolyDataFilter filtro filtro triangularizado y escalado bool isOrgano diferencia organos y herramientas Por ltimo se procede como es habitual en VTK es decir creaci n de un mapper asociaci n del mapper al actor y por ltimo se a ade el actor al Render Es muy importante tener en cuenta que el mapper necesita el filtro del
56. eview of mechanism used in laparoscopic surgical instruments Jonas J B Lim a Arthur G Erdman b http www sciencedirect com e PFC original de Jose Ignacio Reolid sobre reconstrucci n 3D UMH e A Survey of Surgical Simulation Applications Technology and Education Alan Liu Frank Tendick Kevin Cleary Christoph Kaufmann e http www cs unc edu geom V_COLLIDE e Curso pr ctico de programaci n en C y C Jorge Badenas Carpio Jos Luis Llopis Borr s Oscar Coltell Simon Colecci n Universitat Jaume I EndoWrist Instruments Accessories Catalog http www intuitivesurgical com e Vector Math for 3D Computer Graphics http chortle ccsu edu VectorLessons vectorIndex html e C Gui Programming with QT 4 Jasmin Blanchette Mark Summerfield Prentice Hall
57. formPolyDataFilter algorithmFiltered vtkTransformPolyDataFilter New algorithmFiltered gt SetInputConnection tri0bject gt GetOutputPort algorithmFiltered gt SetTransform tr para que getpoints no devuelva cero tri0bject gt Update algorithmFiltered gt Update vtkPoints puntos vtkPoints New puntos algorithmFiltered gt GetOutput gt GetPoints std cout lt lt matriz din mica de lt lt puntos gt GetNumberOfPoints lt lt puntos lt lt std endl creamos matriz dinamica para almacenar coordenadas de los puntos double matriz matriz new double puntos gt GetNumberOfPoints for int i 0 i lt puntos gt GetNumberOfPoints 1 matriz i new double 3 almacena las coordenadas de los puntos en la matriz dinamica for int i 0 i lt puntos gt GetNumberOfPoints i puntos gt GetPoint i matriz i crea un nuevo objeto VCollide y lo prepara para afiadirle triangulos vc NewObject id Despues de llamar a NewObject VCollide ya ha asignado un id int numObj id cout lt lt COF ha asignado para un nuevo objeto el id lt lt numObj lt lt n Almacena informaci n sobr 1 objeto en PiezasArray PA indice this gt SetDataOfObjectInPiezasArray numObj nombre actor algorithmFiltered cout lt lt COF ha asignado para un nuevo objeto el id interno lt lt PA indice lt lt n afiadimos
58. ga de Abrir y Cerrar las tijeras Para ello comprueba si no se excede de un ngulo maximo de apertura y o cierre y si no se excede se procede a rotar individualmente las piezas xtremo Tijeral y Tijera2 y si se produce una colisi n se deshace el movimiento de igual forma que en el m todo RotarHerramienta void Tijeras AbrirCerrarPinzas float alfa por cada clic se abre un angulo alfa int colision 0 double angulo actual this gt GetAnguloRotadoAbertura obtiene angulo double angulo angulo actualt alfa calcula el nuevo angulo cout lt lt angulo lt lt angulo lt lt n si el nuevo angulo es menor que el maximo permitido ejecuta el movimiento if angulo lt 40 amp amp angulo gt 7 this gt ActorsArray 2 gt RotateZ alfa this gt ActorsArray 3 gt RotateZ alfa this gt OCF gt UpdateAssembliesMatrices this gt Ensamblado this gt Ensamblado2 this gt ActorsVCIdArray this gt TransformArray colision this gt AnyActorVisibleHasCollisioned si hay colision de cualquier actor NO INVISIBLE se revierte la operacion if colision 1 this gt ActorsArray 2 gt RotateZ alfa this gt ActorsArray 3 gt RotateZ alfa this gt OCF gt UpdateAssembliesMatrices this gt Ensamblado this gt Ensamblado2 this gt ActorsVCIdArray this gt TransformArray else this gt SetAnguloRotadoAbertura angulo actualiza angulo
59. i n y suponiendo por ejemplo que la ruta en la que se encuentran el archivo CmakeLists txt y el c digo fuente es la siguiente C Simulador_Laparoscopia Proyecto20080523 Cxx Crear una carpeta C Simulador_Laparoscopia Proyecto20080523 Cxx_build Ejecutar Cmake CMake 2 4 patch 6 I Show Advanced Values Where to build the binaries MEM dla itl a Cache Values 24 C Archivos de programa Proyecto23mayo 4 C gt 4 2 3 mkspecs C gt 4 2 3 plugins C qt 4 2 3 bin gmake exe C vtk 5 0 3_build Right click on a cache value for additional options delete ignore and help Press Configure to update and display new values in red Press OK to generate selected build files and exit Ok Cancel Delete Cache Help Single output directory for building all executables Una vez haya acabado su tarea Cmake abrir el archivo sln generado por Cmake con Visual Studio 2005 Seleccionar Menu Projects Properties o Alt F7 y a adir Vcollide lib y RAPID lib tal y como se muestra en la siguiente imagen Proyecto23mayo Property Pages Configuration Active Debug y Platform Active Win32 vw Configuration Manager Common Properties Additional Dependencies NOINHERIT YCollide lib RAPID lib kernel32 lib user Configuration Properties Ignore All Default Libraries No General Ignore Specific Library Debugging Module Definition File C C Add Module to Assembly Linker Embed Managed Resource File Ge
60. iento excede la capacidad de c lculo de los ordenadores convencionales requiriendo alcanzar una soluci n de compromiso entre realismo y prestaciones Actualmente con los simuladores virtuales se pueden realizar pr cticamente la mayor a de los ejercicios b sicos coordinaci n mano vista corte cauterizaci n anudado etc sin embargo quedan por desarrollar ejercicios complejos que requieren ordenadores de mayor potencia No obstante se est n dando los pasos necesarios para que en los pr ximos a os podamos disponer de simuladores que nos permitan reproducir alguno de los procedimientos quir rgicos que ahora requieren el empleo de animales de experimentaci n 13 Requisitos del simulador de laparoscopia Para un realismo visual se precisa una frecuencia de refresco de entre 20 Hz y 60 Hz Por otro lado dada la mayor resoluci n en sensaci n de tacto que poseen los seres humanos stos precisan de una frecuencia de refresco de entre 300 Hz y 1000 Hz para tener una sensaci n realista en este tipo de realimentaciones Por otro lado para este proyecto se trabajar con rganos r gidos es decir no deformables y se requerir la detecci n de colisiones entre los rganos y las herramientas de laparoscopia 14 Cap tulo 2 Modelado de herramientas para laparoscopia Revisi n de las herramientas actuales Un mecanismo es un dispositivo mec nico que se compone de piezas conectadas unas con otras mediante uniones
61. il false for int k 0 k lt this gt OCF gt report numTriPairs obj pair num k t if tril true num_tri this gt OCF gt report trilID obj pair _num k else num_tri this gt OCF gt report tri2ID obj pair _num k pinta de color rojo scalars gt SetTuple4 num_tri 220 17 17 255 this gt OCF gt GetFilterOfPiezasArray organo PA Id gt GetOutput gt GetCellData gt Modified else std cout lt lt No puede pintar n Anexo C Manual de usuario de V Collide V COLLIDE USER S MANUAL Release 2 01 INTRODUCTION The V Collide collision detection library performs efficient and exact collision detection between triangulated polygonal models LE uses a 2 level hierarchical approach the top level eliminates from consideration pairs of objects that are not close to each other while the bottom level performs exact collision detection down to the level of the triangles themselves The basic steps involved in using this library are creating objects adding sets of triangles to these objects choosing which pairs of objects should be tested for collisions setting the positions of the objects performing the collision test and getting back reports of the test results Based on these results and any other parameters of the simulation interaction the objects may be moved and the collisions tested again etc V Collide
62. imer paso por tanto es declarar la clase de la herramienta como hija de Herramienta3D Para ello en el archivo Tijeras h class Tijeras public Herramienta3D En cuanto al archivo Tijeras cpp se compone de los siguientes m todos que despues veremos en detalle constructor de la clase destructor de la clase clicIzq clicDer AbrirCerrarPinzas RotarHerramienta El constructor de la clase se encarga de realizar mediante apoyo en la clase padre Herramienta3D las siguientes operaciones inicializaciones de objetos y variables necesarias asignaci n de nombres a cada una de las piezas y creaci n de actores vtkActor a partir de cada uno de los ficheros OBJ generados en el apartado anterior asociaci n con el sistema de detecci n de colisiones e inclusi n de los objetos colisionables desactivaci n de la colisi n entra las propias piezas de la herramienta posicionamiento de las piezas para formar la herramienta creaci n de dos ensamblados vtkAssembly para modelar la herramienta Al tratarse de una herramienta articulada necesita del uso de dos ensamblados Si por el contrario se desea modelar una herramienta fija s lo ser a necesaria la creaci n de un ensamblado Veamos a continuaci n el c digo del constructor de la clase Tijeras Tijeras Tijeras CollisionObjectFactory factory int izq std cout lt lt Constructor de Tijeras n int posx double centro char objectName vtkOBJRea
63. inzas y grapadoras En la figura se muestran varias herramientas de tipo pinza Round Tooth Forceps 400035 DeBakey Forceps 400036 Long Tip Forceps 400048 Cadiere Forceps 400049 En la siguiente figura se muestran algunos ejemplos de tijeras Potts Scissors 400001 Round Tip Scissors 400007 Curved Scissors 400178 Small Clip Applier 400003 En este proyecto se ha dise ado una herramienta grapadora que se podr a utilizar tanto como de pinzas como de herramienta grapadora e incluso como herramienta de cauterizaci n Se trata de una modelo sencillo compuesto de un tubo y de una semiesfera alargada tal y como estaba hecho el l piz pero adem s se compone de dos ortoedros para formar la parte de grapadora o de pinza Para crear la articulaci n se ha hecho uso de objetos de tipo Ensamblado Para m s informaci n consultar la clase vtkAssembly de las librer as vtk 25 W Simulador H ptico para entrenamiento de t cnicas de Laparoscopia Archivo Organo Herramienta Der Herramienta Izq En estas herramientas se pueden realizar acciones como por ejemplo abrir cerrar las pinzas grapar rotar las pinzas 26 Otras herramientas Adem s de las herramientas vistas en los apartados anteriores existen otras herramientas como herramientas para coser herramientas de tubo flexible etc pero que no han sido objeto de estudio en este proyecto De todas formas si se qu
64. is written in C and unlike previous versions Release 2 01 no longer provides C interface C COMMAND REFERENCE include lt VCollide H gt int VCollide NewObject int id Create a new object and prepare it for adding triangles int VCollide AddTri double v1 3 double v2 3 double v3 3 int tri_id 0 Add triangles to the current object only valid between NewObject and EndObject and give an id to the triangle If no triangle id is given the default is 0 int VCollide EndObject void Finish adding triangles to the current object and build the hierarchical collision detection structures for the object int VCollide DeleteObject int id Delete an object int VCollide ActivateObject int id Turn on collision detection for an object int VCollide DeactivateObject int id Turn off collision detection for an object dete flag VC_ FIRST CONTACT intersection int VCollide ActivatePair int idl int id2 Turn on collision detection between a specific pair of objects int VCollide DeactivatePair int idl int id2 Turn off collision detection between a specific pair of objects int VCollide UpdateTrans int id double trans 4 4 Update the transformation applied to an object Note that we consider only the change in position of the object Scaling is not supported int
65. isieran realizar teniendo en cuenta los avances de este proyecto su complejidad se resumir a en el dise o de las partes de la herramienta mediante una herramienta gr fica de dise o 3D 21 Cap tulo 3 Arquitectura del simulador quir rgico de VR2 Introducci n a las librerias VTK VTK Visualzation Toolkit es un conjunto de librer as desarrollado por Kitware consistente en un sistema de visualizaci n por software que permite la visualizaci n de geometr as 3D soportando una amplia variedad de algoritmos de visualizaci n y modelado El ser una herramienta open source ha impulsado una gran difusi n de la misma extendiendo su aplicaci n a pr cticamente todos los campos en los que se emplean objetos 3D entre los que destacan la medicina las herramientas industriales Las funciones que integran VTK se basan en los principios de orientaci n a objetos conformando un completo sistema jer rquico de filtros y fuentes que dotan de gran flexibilidad a todo el sistema El modelo gr fico de VTK posee un nivel de abstracci n mayor que el de otras librer as de renderizado como OpenGL o PEX lo que se traduce en una mayor sencillez a la hora de la implementaci n de aplicaciones gr ficas por parte del programador VTK no consiste nicamente en un sistema de visualizaci n sino que aporta una amplia gama de algoritmos para tratar las im genes y objetos creados permitiendo entre otras cosas el a adir texturas aplicar tensor
66. l organo colisionado int organo PA Id this gt OCF gt GetOrganoCollisionedWithHerramienta this gt ActorsVCIdArray 1 comprueba si ha colisionado el objeto invisible y si ademas ha colisionado con un organo if this gt OCF gt HasCollisioned this gt ActorsvVClIdArray 1 amp amp organo_ PA Id 1 tiene que pintar int numCeldas scalars vtkUnsignedCharArray SafeDownCast this gt OCF gt GetFilterOfPiezasArray organo PA Id gt GetOutput gt GetCellData gt GetScalars if scalars NULL numCeldas this gt 0CF gt GetFilterOfPiezasArray organo PA Id gt GetOutput gt GetNumberOfCells std cout lt lt generando scalars para numceldas lt lt numCeldas lt lt std endl scalars vtkUnsignedCharArray New scalars gt SetNumberOfComponents 4 scalars gt SetNumberOfTuples numCeldas float r 0 float g 0 float b 0 for int i 0 i lt numCeldas itt scalars gt SetTuple4 1 255 255 255 255 this gt OCF gt GetFilterOfPiezasArray organo PA Id gt GetOutput gt GetCellData gt SetScalars scalars this gt OCF gt GetFilterOfPiezasArray organo PA Id gt GetOutput gt GetCellData gt Modified PINTA int obj _ pair num this gt OCF gt GetCollisionedPairO0fObjectsNum this gt ActorsVCIdArrayl1 int num tri para saber si se ha de colorear trilID o tri2ID int obj_id this gt OCF gt report obj1ID o0b3 pair num bool
67. llision and which may be ignored With V Collide 2 01 you can specify whether you want the library to just report which pairs of objects are currently in contact or in addition to that which triangles are intersecting between each pair of intersecting objects INITIALIZATION Users may initialize a collision detection engine by declaring a VCollide object It is possible to run multiple independent collision detection engines by simply declaring multiple VCollide objects CREATING OBJECTS n To create an object first call NewObject which will set up an empty object and provide an integer ID for that object For every triangle in the object call AddTri with the coordinates of its three vertices If you want the library to report the intersecting triangles between objects calling Collide with VC_ ALL CONTACTS you need to call AddTri with an additional integer argument to identify each triangle in the object If the object has faces with more than three vertices you will first need to triangulate them Vhen you are done adding triangles call EndObject This tells the library to build its data structures for the object The only library call which may appear between NewObject and EndObject is AddTri Objects can be deleted with DeleteObject You can create or delete objects at any time during the simulation but
68. lone License File Edit Tools Group Views Create Modifiers Character reactor Animation Graph Editors Rendering Customize MAXScript Help PARA ANA RARA JABOaT DEDO thet Type AutoGrid 7 os Lae Sphere 6 see 100 t E eee E aa Auto Key Selected al an e mo Q GB 8 A Setkey JY KepFiters 0 lt B gt 5 E Click or click and drag to select objects Como se puede apreciar en la figura las tijeras est n compuestas de 4 piezas que podr amos llamar Tubo Esfera para la articulaci n Pinzal y Pinza2 Tubo se ha obtenido a partir del tipo de objeto Cylinder de 3DS Max El resto de piezas Esfera Pinzal y Pinza2 se han obtenido a partir de modificaciones del tipo de objeto Sphere En la siguiente imagen se observan los cuatro objetos 3D separados Una de las pinzas aparece seleccionada y sus propiedades de modificaci n aparecen a la derecha dentro del marco Parameters Para una mejor lectura la siguiente tabla muestra los par metros y sus valores Radius 4 0 Segments 30 Smooth Activada Hemisphere 0 4 Chop Activada Slice On Activado Slice From 0 0 Slice To 316 492 Base To Pivot Desactivado Generate Mapping Coords Activado Real World Map Size Desactivado tijeras max Autodesk 3ds Max 8 Stand alone License File Edit Tools Group Views Create Modifiers Character reactor Animation Graph Editors Rendering Customize MAXScript Help le ale A E E SSI OH
69. ncionalidades m s importantes de esta clase son a adir objetos al sistema de colisiones eliminar objetos del sistema de colisiones desactivar la colisi n entre pares de objetos actualizar la matriz de transformaci n de un ensamblado determinar qu rgano ha colisionado con alguna herramienta determinar si una determinada pieza ha colisionado calcular colisiones informar sobre colisiones A adir objetos al sistema de colisiones El m todo AddObject Este m todo se encarga de hacer el siguiente procesado con el objeto que se le pasa como par metro triangularizaci n de los pol gonos escalado en los ejes X Y y Z Obtenci n de informaci n de los tri ngulos coordenadas de los v rtices y asociaciones de v rtices y almacenamiento en matrices din micas creaci n de un objeto Vcollide utilizando para ello la informaci n de los triangulos almacenada en las matrices din micas Almacenar informaci n sobre el objeto en la estructura de datos PiezasArray La definici n del m todo AddObject A ade objeto al sistema VCollide y almacena el indice del array PiezasArray void AddObject int id vtkAlgorithm algorithm double scaleX double scaleY double scaleZ char nombre vtkActor actor int PA indice Para un ejemplo sencillo de funcionamiento de este m todo as como una explicaci n de los par metros ver el punto de Integraci n de VTK y Vcollide Para eliminar un objeto
70. neral Force Symbol References Input i Delay Loaded DLLs Manifest File Debugging Assembly Link Resource System Optimization Embedded IDL Advanced Command Line fH Manifest Tool E XML Document Generator E Browse Information E Build Events E Custom Build Step H Web Deployment Additional Dependencies Specifies additional items to add to the link line ex kernel32 lib configuration specific A partir de aqui ya se puede compilar Anexo B Integraci n de VTK y VCollide Para integrar VTK y VCollide en el proyecto de Laparoscopia se ha desarrollado una clase intermediaria entre VTK y VCollide CollisionObjectFactory En la clase CollisionObjectFactory de ahora en adelante COF se ha desarrollado un m todo fundamental para a adir un objeto VTK al sistema VCollide el m todo AddObject Este m todo se encarga de hacer el siguiente procesado con el objeto que se le pasa como par metro e triangularizaci n de los pol gonos e escalado en los ejes X Y y Z e obtenci n de informaci n de los tri ngulos coordenadas de los v rtices y asociaciones de v rtices y almacenamiento en matrices din micas e creaci n de un objeto Vcollide utilizando para ello la informaci n de los triangulos almacenada en las matrices din micas La definici n del m todo AddObject A ade objeto al sistema VCollide y almacena el indice del array PiezasArray void AddObject
71. nte la cual se realizan nicamente peque as incisiones de aproximadamente 1 cm de di metro A diferencia de la cirug a tradicional en lugar de mirar directamente al rgano del cuerpo que est siendo tratado los m dicos monitorizan el procedimiento a trav s de una videoc mara especial llamada laparoscopio Esta c mara se introduce a trav s de una de los peque os agujeros mientras los otros instrumentos son manipulados desde los otros puntos de incisi n Contrariamente a la cirug a abierta donde los cirujanos pueden manipular y palpar tocar el tejido u rgano durante la operaci n cualquier procedimiento efectuado en la laparoscopia es llevado a cabo utilizando un instrumento laparosc pico dise ado para encajar dentro del cuerpo a trav s de unas gu as llamadas trocar que entra a trav s de la peque a incisi n El objetivo de este dise o es transformar el movimiento de la mano del cirujano a trav s de un largo tubo de peque o di metro creando una o m s funciones de salida en la punta opuesta dentro de la cavidad del cuerpo 10 a Intervenci n de laparoscopia los cirujanos y sus b Instrumental quir rgico para una intervenci n de ayudantes observan el campo operatorio a trav s de cirug a laparosc pica un monitor de video 2D c Creaci n de un peque o corte a trav s del que se d Introducci n del instrumental quir rgico introducir un instrumento quir rgico e T picos puntos de entrada
72. o v1 1 v2 2 v3 4 De esta forma un caso en el que son activos los vertices vl y v3 se corresponde al numero 5 vl y v3 son positivos 1 4 5 Para todos los cubos mostrados anteriormente exite su complementario Construir el complementario consiste nicamente en voltear las normales del cubo original En la siguiente imagen se pueden mostrar algunos ejemplos de cubos asi como sus normales Tal y como se explico para el caso de los marching squares en este algoritmo tambien existen algunos casos ambiguos como se mostrar m s adelante En el caso de espacios 3D este inconveniente llega a ser cr tico aunque realmente no son nicamente los casos ambiguos los que pueden crear disfunciones en la topolog a ya que algunas familias cl sicas son incompatibles entre si La siguiente imagen muestra la problem tica de este 3 2 6 os MY algoritmo 2 3 2 3 7 Cases 3 and6 Cases 3 and 6c La forma m s sencilla de solucionar esto y que funciona realmente bien es a adiendo 6 familias nuevas a los casos de marching cubes Estas familiar deben de ser utilizadas como casos complementarios Case 3 Case 6c 2 3 6 3 Case 10c vtkMarchingCubes vtkMarchingCubes es un filtro perteneciente a las librerias Vtk desarrolladas por Kitware ste toma por entrada un volumen ej un set de puntos estructurados 3D y se encarga de generar
73. o 0 96 desplazamos las pinzas la longitud del tubo ActorsArray 2 gt AddPosition 0 0 longTubo 0 96 ActorsArray 3 gt AddPosition 0 0 longTubo 0 96 creamos Crea un this gt Ensamblado2 un ensamblado con la esfera y las tapas nuevo Assembly A ade los actores al Assembly for int i 1 i lt componentsNumber pe ask vtkAssembly New this gt Ensamblado2 gt AddPart this gt ActorsArrayli establece los angulos this gt OCF this gt SetAnguloRotadoElevacion 0 this gt SetAnguloRotadoAzimuth 0 Desactiva colisiones this gt OCF gt DeactivateCollision obj this gt OCF ision objec tsNameArray ectsNameArray ec tivateColl ision obj tivateColl this gt OCF ision obj gt Deact tivateColl this gt OCF ision obj ision obj ectsNam ectsNam ectsNam Crea un nuevo Assembly tsNameArray eArray eArray eArray this gt Ensamb ado vtkAssembly A ade los this gt Ensamb actores al Assembly 0 obj 1 0b3 1 0b3 2 ob New jectsNameArray ectsNameArray jectsNameArray ectsNameArray ectsNameArray ectsNameArray ado gt AddPart this gt ActorsArray 0 this gt Ensamblado gt AddPart this gt Ensamblado2 this gt Ensamblado gt SetO
74. o 6 Simulador LAPUMH Interfaz Visual QT con VTK Qt es una biblioteca multiplataforma para desarrollar interfaces gr ficas de usuario Fue creada por la compa a noruega Trolltech Qt es utilizada en KDE un entorno de escritorio para sistemas como GNU Linux o FreeBSD entre otros Utiliza el lenguaje de programaci n C de forma nativa y adem s existen bindings para C Python PyQt Java Qt Jambi Perl PerlQt Gambas gb qt Ruby QtRuby PHP PHP Qt y Mono Qyoto entre otros Para enlazar QT y VTK se ha utilizado QVTK La ventana de renderizado VTK se ha conectado con QT a traves de la clase QVTK Widget A continuaci n se muestra parte del c digo fuente de la clase Principal en concreto la parte encargada de la inicializaci n de la instancia QVTK Widget y su asociaci n con la ventana de renderizado VTK stage new OVTKWidget setCentralWidget stage stage gt GetRenderWindow gt AddRenderer ren stage gt GetRenderWindow gt SetInteractor iren stage gt GetRenderWindow gt Render Aspecto Interfaz El aspecto de la interfaz es sencillo consta de una barra de ment con los siguientes menu Archivo Organo Herramienta Der y Herramienta Izq A continuaci n se muestra una captura de pantalla Archivo Organo Herramienta Izq Lapiz Line Plotter Cutter Tijeras Pinza Al ejecutar la aplicaci n se abre otra ventana donde aparece una consola de texto y en la que apare
75. odified else std cout lt lt No puede pintar n A continuaci n se muestra una imagen en la que el cutter ha pintado cortado varias rganos E Simulador H ptico para entrenamiento de t cnicas de Laparoscopia Archivo Organo Herramienta Der Herramienta Izq La clase Herramienta3D Como hemos podido comprobar en los anteriores apartados donde se hablaba sobre herramientas articuladas y herramientas fijas ambos tipos de herramientas tienen en comun a nivel de c digo fuente que heredan de la misma clase Herramienta3D La clase Herramienta3D se compone de los siguientes m todos constructor de la clase destructor de la clase AddAction GetAction Azimuth Elevation ruedaDelante ruedaAtras AddPositionX YZ CreateDynamicArrays DeleteDynamicArrays RotateXYZAssembly AnyActorVisibleHasCollisioned ReadOBJFile teclaPulsada A continuaci n se ofrece una explicaci n de la funcionalidad de dichos m todos El constructor se encarga de realizar las inicializaciones necesarias y el destructor se encarga de liberar memoria de los objetos inicializados Una acci n es una operaci n caracteristica que realiza una herramienta por ejemplo rotar pintar grapar son ejemplos de acciones Dado que cada herramienta puede tener cero 0 m s acciones para a adir una acci n realmente se a ade el texto que indica qu accion es capaz de realizar se utiliza el m todo AddAction
76. ompiladores mencionados anteriormente MOC y UIC puedan trabajar correctamente ADD DEFINITIONS DQT_ GUI LIBS DQT_ CORE LIB DQT3_SUPPORT Se indica la dependencia entre las cabeceras UlHeaders y los Fuentes de Qt SET_SOURCE FILES PROPERTIES PruebasSrcs PROPERTIES OBJECT_DEPENDS UlHeaders ELSE DESIRED_QT_VERSION MATCHES 4 ENDIF DESIRED_QT_VERSION MATCHES 4 Es muy c modo que aparezca un listado de los ficheros ui en las diferentes listas de ficheros de los compiladores ya que permitir con un doble click abrir el QtDesigner para su modificaci n Para ello es necesario incluir el siguiente c digo en el proyecto IF CMAKE BUILD TOOL MATCHES msdev SET PruebasSrcs PruebasSrcs UIS ENDIF CMAKE BUILD TOOL MATCHES msdev IF CMAKE BUILD TOOL MATCHES devenv SET PruebasSrcs PruebasSrcs UIS ENDIF CMAKE BUILD TOOL MATCHES devenv Parte propia de cualquier proyecto VTk donde ademas de indicar el nombre y tipo de la salida se incluyen los tres paths de ficheros fuente ADD_EXECUTABLE Proyecto23mayo MACOSX BUNDLE PruebasSrcs UISres MOCSrcs PruebasHeaders Dentro de las librerias objetivo target se incluye tanto la del proyecto Pruebas como la resefia de la libreria QVTK TARGET LINK LIBRARIES Proyecto23mayo QVTK QT_ LIBRARIES vtkRendering vtkGraphics vtkIO vtkCommon vtkHybrid vtkImaging vtksys vtkFiltering vtkVolumeRendering A continuac
77. onnccnnnonns 15 Revisi n de las herramientas actuales ooooocnnncnnococonaconcnonnnconnccnno cnn cono nono ncconocnnnconncconncnn 15 Modelado de herramientas tipo A punteros con mu eca articulada y fijas 23 Modelado de herramientas tipo B pinzas con mu eca articulada y fijas 25 Otras herramientas ar di asii 27 Cap tulo 3 Arquitectura del simulador quir rgico de VR2 d oooocococcciccconoccnonoconacnnnconncconnnnno 28 Introducci n a las librerias VER de Ads 28 Algoritmo de reconstrucci n 3D utilizado marching cubes ooooonoccnnnccnococinccconacannnnnnoos 29 Algoritmo de colisiones Uti Zado s nenita dia dic 37 Cap tulo 4 Detecci n de colisiones o dao cios 42 Introducci n a las librerias V Collide nai a 43 Integraci n de VTK y Vcollide id AAA cust da A A 44 La clase CollistonObjectE acto in 49 Capitulo 5 Creaci n de herramientas 3D con VTkKiionac 54 A aeaa 54 Dise o de herramientas con 3DS Mat nia 54 Almacenado de las piezas en un formato adecuado ooocoocncoccnococonccconaconononnnconnccnocanccnnnnos 58 Desarrollo de c digo para simular la herramienta oooocnnnncniococonocononoonnconncconoconn nono ncnnncnnn 59 Herramientas Artico ada AR 59 Herramientas Pla at A AES 65 Ea Clase Herramienta Di E A Aa 72 Cap tulo 6 Simulador LA PUMA is 80 Interfaz Visual OE o Re A 80 PIS PO CUO ME is ib 80 Herramientas O AA A dana bn tases 82 Cap tulo 7 Conclusiones y trabajo futuro ooo
78. oocnnccinococonoconcnonnnonnnocononnno nono ccoo nono no naar conc cconnnons 87 EA o bata aan 87 Trabajo PUTO A O A A a es ae 88 ANEXOS ii A A ice 89 Anexo A Configuraci n del entorno para depurar oooonocccinccconoconccconoconcnonn nono ncconocanccnnnno 89 Anexo B Integraci n de VTK y VCollide oooooconoccnonociccnononconncconoconnnonncconccconocnnanonnnos 98 Anexo C Manual de usuario de V Collide oooooonccinoconococonanonnnononconnccono conc crac cconncco necios 106 Anexo Dy BIO a A a Ar Aa da 111 Resumen El proyecto realizado se engloba dentro del proyecto de rob tica quir rgica desarrollado por el grupo de Rob tica y Realidad Virtual perteneciente al Departamento de Ingenier a de Sistemas Industriales de la Universidad Miguel Hern ndez de Elche El objetivo de dicho grupo es el desarrollo de un sistema de telecirug a en el que a partir de im genes biom dicas captadas por un aparato de diagn stico tipo CT Tomograf a Computerizada se generen cuerpos 3D de los rganos deseados permitiendo interactuar con los mismos mediante un interfaz h ptico Mediante el sistema descrito anteriormente el usuario ser capaz de planificar operaciones e incluso de realizarlas en tiempo real mediante un sistema rob tico desarrollado tambi n por este grupo El principal objetivo de este proyecto es el estudio de las librer as VTK orient ndolo a la creaci n de herramientas 3D para la intervenci n laparosc pica y su integra
79. os UpdateAssemblyMatrix y UpdateAssembliesMatrices para herramientas que se compongan de uno o de dos ensamblados respectivamente Como el primer m todo se podr a considerar una versi n mucho m s simplificada del m todo para m s de un ensamblado pasaremos a hablar de este ltimo En el caso de que la herramienta se componga de dos ensamblados se presupone la siguiente hip tesis la herramienta se compone de un total de x actores el ensamblado principal se compone de un actor y de un ensamblado secundario el ensamblado secundario se compone de x 1 actores Mediante operaciones de concatenaci n de matrices el m todo UpdateAssembliesMatrices Obtiene los valores de la matriz con los que tendr que actualizar su correspondiente matriz en Vcollide De esta forma resulta muy sencillo actualizar la matriz de transformaci n de una herramienta de dos ensamblados void CollisionObjectFactory UpdateAssembliesMatrices vtkAssembly ensamblado vtkAssembly ensamblado2 int actorsIdArray vtkTransform transformArray Ejemplo de actualizaci n de una herramienta de laparoscopia actualiza la matriz del ensamblado this gt OCF gt UpdateAssembliesMatrices this gt Ensamblado this gt Ensamblado2 this gt ActorsVCIdArray this gt TransformArray Como se puede observar en la definici n del m todo requiere que la herramienta tenga asociada un array de identificadores en Vcollide as como un array de objet
80. os vtkTransform para el c lculo de las correspondientes matrices de transformaci n Determinar qu rgano ha colisionado con alguna herramienta En el caso de que haya habido colisi n entre un par de objetos quiz s nos interese determinar si ha habido colisi n de un rgano con una herramienta para ello podemos hacer uso del m todo GetOrganoCollisionedWithHerramienta devuelve el Id del organo que ha colisionado con la herramienta Si devuelve 1 no hay colision organo herramienta int GetOrganoCollisionedWithHerramienta int Herr VC id En el caso de que haya colisi n de la herramienta con alg n rgano devuelve el identificador en Vcollide del rgano Determinar si una pieza ha colisionado HasCollisioned permite saber si una determinada pieza colisionable ha colisionado devuelve 1 si hay colision int HasCollisioned int VC_id Por ltimo para calcular colisiones y obtener un informe de colisiones podemos utilizar los m todos CalculateCollisions e InformAboutCollisions Este ltimo m todo antes de mostrar informaci n sobre las colisiones llama al m todo CalculateCollisions int CollisionObjectFactory HasCollisioned int VC_id int J7 for 3 0 af j lt report numObjPairs j report obj1ID j VC_id report obj2ID j VC_id stadi scout lt lt YO lt lt VE 1d lt lt T Hastollasioned lt lt report obj11D 3 lt lt y lt lt report obj2ID j lt l
81. por V Collide es proyectar los centros de las cajas en el eje y tambien calcular el radio de los intervalos Si la distancia entre los centros de las cajas proyectados en el eje es m s grande que la suma de los radios entonces los intervalos y por tanto las cajas est n separados Asumiendo dos OBB s A y B con B colocado una posici n relativa a A mediante una rotaci n R y una traslaci n T Siendo a y b los radios de A y B donde i 1 2 3 Llamando a los ejes de A y B como los vectores unitarios 4 y B para i 1 2 3 hablaremos entonces de los 6 ejes de las cajas N tese que si utilizamos los ejes de la caja de A como base las tres columnas de R son las mismas que los tres vectores B Los centros de cada caja se proyectan en el punto medio del intervalo Proyectando los radios de la caja en el eje y sumando la longitud de sus im genes se obtiene el radio del intervalo Si el eje es paralelo al vector unitario L entonces el radio del intervalo de la caja A es a A E n i De forma similar se obtiene la expresi n para rg La colocaci n del eje es inmaterial por lo que asumimos que pasa a trav s del centro de la caja A La distancia entre los puntos medios de los intervalos son intervalos ir Z Por tanto los intervalos est n separados si se cumple gt 6 8 T No obstante y dependiendo de las condiciones por ejemplo si L se puede obtener como 7 1 gt Vlad r producto vectorial de A
82. quier otro editor gr fico 3D pero se ha optado por 3DS Max por tratarse de un software ampliamente utilizado y universalmente conocido La versi n utilizada de este software ha sido la versi n 8 About 3ds Max Serial 666 12345678 Driver Direct3D 9 0 Mobile Intel R Release 8 0 commercial License Type Stand alone License Behavior Permanent License Days Left Indefinite LicenselD 1231233385 Product Management Madeleine Jean Product Specialists Pierre F lix Breton lan Nies Kelcey Privett Development and Developer Support Susan Amkraut Michaelson Britt David Cunningham Michael Girard Neil Hazzard Richard Laperriere Nicolas Leonard Daniel Levesque Stephane Levesque Larry Minton Chloe Mignot Claude Robillard Laurent Ruhlmann Michael Russo Attila Szabo Peter Watje Michael Zyracki gt a t O A M N A Quality Engineering Zarkaru Raker Martha Rall Dehhie Ramhan lan Rarheri Yann Rertaud This work is protected by U S and international copyright laws This product is licensed not sold Its use is subject to the terms of the license agreement included in the package and agreed to during the installation process Copyright 1997 2005 Autodesk Inc All rights reserved En este apartado se explica a modo de ejemplo c mo dise ar una herramienta de tipo tijeras O pinzas El dise o final de la herramienta ser el que se muestra a continuaci n tijeras max Autodesk 3ds Max 8 Stand a
83. r las esquinas que estan dentro de la superficie reprensentadas mediante puntos verdes Ahora podemos insertar algunos vertices de forma que si sabemos que puntos est n dentro y que puntos est n fuera podemos concluir que un vertice debe estar posicionado aproximadamente a medio camino entre una esquina interior y una esquina exterior que estan conectadas por el eje de una celda La imagen del centro muestra los vertices interpolados como peque os puntos rojos mientras que en la imagen de la derecha aparece la superficie formada mediante la uni n de los vertices con las l neas Esquinas dentro Vertices Superficie de la superficie Interpolados Reconstruida Algoritmo Marching Cubes Analizando el algoritmo de los Marching Squares es posible adaptarlo para aprovechar sus funcionalidades en un caso 3D derivando en el algoritmo marching cubes El algoritmo parte de que en un espacio 3D es posible enumerar 256 situaciones diferentes para la representacion de los cubos Este n mero de casos puede resultar todav a alto por lo que mediante rotaciones y simetrias es posible reducir el n mero a nicamente a las15 familias del dibujo Con el objetivo de poder determinar cada caso real se adopta una dotacion concreta lo que permite referenciar cada caso por un indice creado de la interpretaci n binaria de los pesos de las esquinas Case v8 v7 v6 v5 v4 v3 v2 v1 Los vertices del 1 al 8 tienen pesos del 1 al 128 en binari
84. rar la librer a VTK y en el caso de no encontrarla emite un mensaje de error y se solicita que se indique el directorio donde se encuentra FIND_PACKAGE VTK IF NOT VTK_DIR MESSAGE FATAL ERROR Indica donde se encuentra el directorio de VTK VTK_DIR ENDIF NOT VTK_DIR INCLUDE VTK_USE_FILE Se indica donde se encuentra los ejecutables propios de QT SET QT_MOC EXECUTABLE VTK_QT_MOC_EXECUTABLE CACHE FILEPATH SET QT_UIC EXECUTABLE VTK_QT_UIC_EXECUTABLE CACHE FILEPATH SET QT QMAKE EXECUTABLE VTK_QT QMAKE EXECUTABLE CACHE FILEPATH SET DESIRED QT VERSION VTK DESIRED QT VERSION CACHE FILEPATH SE DETECTA LA VESION QUE ESTA INSTALADA FIND PACKAGE Qt IF QT_USE_FILE INCLUDE QT_USE_FILE ELSE QT USE FILE SET QT_ LIBRARIES QT QT LIBRARY ENDIF QT_USE_FILE Se indica donde esta cada una de las fuentesy de que tipo se trata SET PruebasSrcs main cxx Se incluye directorios para compilar el codigo fuente Este comando es heredado por cualquier subdirectorio En el caso de que Cmake descienda a trav s de una estructura de directorios siguen estando habilitados Afiadimos los directorios de QT e incluimos dos directorios de CMake necesarios para el proceso INCLUDE_DIRECTORIES QT INCLUDE DIR CMAKE CURRENT BINARY DIR CMAKE CURRENT SOURCE DIR IF DESIRED QT VERSION MATCHES 4 Todas las fuentes que se quieran utilizar deben de ser incluidas en la lista apropiada Fichero
85. rgicas en el marco de la ense anza de medicina est adquiriendo cada vez m s importancia respecto a los m todos de ense anza tradicionales Los simuladores ofrecen una experiencia de aprendizaje estructurada permitiendo practicar sin da ar a los pacientes Adem s facilitan la ense anza de casos inusuales y pueden utilizarse para conseguir un nivel determinado de habilidades La simulaci n es una parte integrada en la educaci n quir rgica Los cirujanos desarrollan y adquieren habilidades a trav s de la pr ctica Para aprender las t cnicas se utilizan animales cad veres y pacientes Esto tiene muchas desventajas ya que los animales tienen una anatom a diferente los cad veres no tienen la respuesta fisiol gica adecuada y en el caso de pacientes existe un riesgo de da arlos al estar practicando con ellos un aprendiz De igual forma el campo de la cirug a ha experimentado avances dando lugar a un tipo de cirug a la cirug a minimamente invasiva La cirug a minimamente invasiva es una t cnica que permite intervenciones a trav s de incisiones muy peque as Este procedimiento minimiza el trauma del paciente y requiere per odos de rehabilitaci n m s cortos con respecto a la cirug a abierta Sin embargo debido a que la visibilidad y la operabilidad de las herramientas es reducida constituye un procedimiento quir rgico complejo Si el entrenamiento es esencial en cualquier tarea especializada en el entrenamiento
86. rigin 0 30 200 centro this gt Ensamblado gt GetCenter Ensamblado gt RotateX 90 Ensamblado gt SetPosition posx 100 centro 1 2 500 actualiza la matriz del ensamblado this gt OCF gt UpdateAssembliesMatrices this gt Ensamblado this Ensamblado2 this gt ActorsVCIdArray this gt TransformArray V delete for int i 0 i lt componentsNumber i auxMapper 1 gt Delete delete filelil delete auxMapper delete file El m todo RotarHerramienta se encarga de rotar el segundo ensamblado que se corresponde con la parte articulada de la herramienta actualizar las matrices en el sistema de detecci n de colisiones y comprobar si ha habido colisi n por si se tiene que deshacer la operaci n de rotaci n void Tijeras RotarHerramienta float alfa int colision 0 this gt Ensamblado2 gt RotateZ alfa this gt OCF gt UpdateAssembliesMatrices this gt Ensamblado this gt Ensamblado2 this gt ActorsVCIdArray this gt TransformArray colision this gt AnyActorVisibleHasCollisioned si hay colision de cualquier actor NO INVISIBLE se revierte la operacion if colision 1 this gt Ensamblado2 gt Rotatez alfa this gt OCF gt UpdateAssembliesMatrices this gt Ensamblado this gt Ensamblado2 this gt ActorsVCIdArray this gt TransformArray El m todo AbrirCerrarPinzas se encar
87. rmSDK include HTML Designer CInstallDir PlatFormSDK common include Windows Forms Designer FrameworkSDKDirjinclude Ce ee a E gt Include Directories Path to use when searching For include Files while building a C project Corresponds to environment variable INCLUDE Options E Environment Platform Show directories For Library files v Projects and Solutions Win32 General y Build and Run Sa vja xx a Directoties Cu Archivos de programalWTK1lib C Project Settings C RAPID201 Source Control C Collide20 1 Vib Text Editor CInstallDir lib YCInstallDir atlm cilib a Tools VCInstallDir atlmFc ib i3e6 Debugging 1CInstallDir PlatformSDK1lib HTML Designer CInstallDirPlatformSDK common lib Windows Forms Designer FrameworkSDKDir lib YSInstallDir dE TnerallMirib AAA Library Directories Path to use when searching For library files while building a C project Corresponds to environment variable LIB Por ltimo para crear un proyecto de este tipo hay que tener en cuenta los siguientes pasos Creaci n de una carpeta con los fuentes y con un archivo CmakeLists txt A modo de ejemplo se muestra el contenido del archivo CmakeLists txt utilizado en este proyecto Indica cual debe ser el nombre del workspace resultante PROJECT Proyecto23mayo Al incluir el siguiente c digo se utiliza una funcionalidad de Cmake para encont
88. s NULL numCeldas this gt OCF gt GetFilterOfPiezasArray organo PA Id gt GetOutput gt GetNumberOfCells std cout lt lt generando scalars para numceldas lt lt numCeldas lt lt std endl scalars vtkUnsignedCharArray New scalars gt SetNumberOfComponents 4 scalars gt SetNumberOfTuples numCeldas float r 0 float g 0 float b 0 for int i 0 i lt numCeldas i scalars gt SetTuple4 1 255 255 255 255 this gt OCF gt GetFilterOfPiezasArray organo PA Id gt GetOutput gt GetCellData gt SetScalars scalars gt Ge gt Ge this gt OCF gt GetFilterOfPiezasArray organo PA Id tOutput gt GetCellData gt Modified PINTA int obj pair num this gt OCF tCollisionedPairOfObjectsNum this gt ActorsVCIdArray 1 int num tri para saber si se ha de colorear trilID o tri2ID int obj id this gt OCF gt report obj1ID obj pair num bool tril false if obj id organo PA Id tril true lse tril false for int k 0 k lt this gt OCF gt report numTriPairs obj pair num k t if tril true num_tri this gt OCF gt report trilID obj pair num k else num_tri this gt OCF gt report tri2ID obj pair num k pinta de color rojo scalars gt SetTuple 4 num _tri 220 17 17 255 this gt OCF gt GetFilterOfPiezasArray organo PA Id gt GetOutput gt GetCellData gt M
89. s fuente SET PruebasSrcs PruebasSrcs Principal Principal cpp Principal Organo cpp Principal Lapiz cpp Principal LinePlotter cpp Principal MyVTKLinePlotter cpp Principal MyVTKPointPlotter cpp Principal Cutter cpp Principal Pinza cpp Principal Grapadora cpp Principal Tijeras cpp Principal Herramienta3D cpp Principal MyInteractorStyle cpp Principal CollisionObjectFactory cpp Ficheros de interfaz SET UIS Principal Ventana_principal ui Cabeceras SET PruebasHeaders Principal Principal h Principal Organo h Principal Lapiz h Principal LinePlotter h Principal MyVTKLinePlotter h Principal MyVTKPointPlotter h Principal Cutter h Principal Pinza h Principal Grapadora h Principal Tijeras h Principal Herramienta3D h Principal MyInteractorStyle h Principal CollisionObjectFactory h definiciones finales del funcionamiento donde van los ficheros obtenidos de la operacion UIC y MOC Se indican los ficheros que se deben procesar por el motor de Qt En la primera linea se indican los ficheros UIs que seran procesados por el procesador UIC User Interfaz Compiler mientras que en la segunda lina se indican los ficheros Header a procesaro por el sistema MOC Meta Object Compiler QT4 WRAP Ul UIHeaders UIS QT4 WRAP CPP MOCSrcs PruebasHeaders Es necesario incluir la definici n de las librer as Qt e indicar las dependencias entre las cabeceras UlHeaders y los ficheros fuente VT_proyectoSrcs para que los c
90. s tienen poco o nada de control sobre la salida una vez que han apretado el bot n o disparador En herramientas de entrada manual los cirujanos normalmente pueden controlar la velocidad con la que se va a realizar la funci n de salida especialmente para eyectar las grapas y cortar el tejido Controlando la velocidad con la que 18 se apreta el gatillo o cualquier otro tipo de disparador el cirujano puede determinar la velocidad con la que se eyectar n las grapas y o se cortar el tejido La siguiente figura representa una grapadora quir rgica que funciona manualmente El mango de actuaci n est montado mediante un pivote de tal forma que mediante un mecanismo de rosca y muelle controla un movimiento lineal del eje de actuaci n para desplegar las grapas Stationary handle Actuation handle Fig 6 Rotational input 8 La figura siguiente tambi n es una grapadora activada manualmente Esta herramienta se acciona mediante un mecanismo de embudo o entrada deslizante tipo bombin Se trata de un tubo que al hacer fuerza longitudinalmente hace que al otro extremo se desplieguen las grapas 19 Plunger Anticulating lever Fig 7 Sliding input 3 En la siguiente figura se observa las formas comunes de maniobrar una grapadora quir rgica Adem s del grado de libertad que act a la mordaza este dispositivo tiene dos grados adicionales de libertad en articulaci n rotaci n y viraje movimiento a izquier
91. sArray i lt lt n break char Herramienta3D GetAction if this gt actionsArray this gt actionsArraylterator NULL return none return this gt actionsArray this gt actionsArraylterator void Herramienta3D Azimuth float z int colision 0 para corregir saltos grandes debido a que el raton se mueva por fuera de la ventana o por que no est inicializado if abs z gt 8 z 0 obtiene angulo double angulo_actual this gt GetAnguloRotadoAzimuth calcula el nuevo angulo double angulo angulo_actual z si el nuevo angulo es menor que el maximo permitido ejecuta el movimiento if angulo lt 90 amp amp angulo gt 90 true mueve el ensamblado y actualiza las matrices de sus actores en vcollide this gt RotateXYZAssembly 0 Z 0 colision this gt AnyActorVisibleHasCollisioned si hay colision de cualquier actor VISIBLE se revierte la operacion if colision 1 mueve el ensamblado y actualiza las matrices de sus actores en vcollide this gt RotateXYZAssembly 0 z 0 else this gt SetAnguloRotadoAzimuth angulo actualiza angulo hasta aqui si el angulo es permitido void Herramienta3D Elevation float z int colision 0 if abs z gt 8 z 0 para corregir saltos grandes debido a que el raton se mueva por fuera de la ventana o por que no est i imicializado double angulo actual this gt GetAng
92. t 0OCF gt GetOrganoCollisionedWithHerramienta this gt ActorsVCIdArray 1 comprueba si ha colisionado el objeto invisible y si ademas ha colisionado con un organo if this gt OCF gt HasCollisioned this gt ActorsVCIdArray 1 amp amp organo PA Id 1 tiene que pintar int numCeldas scalars vtkUnsignedCharArray SafeDownCast this gt OCF gt GetFilterOfPiezasArray organo PA Id gt GetOutput gt GetCellData gt GetScalars if scalars NULL numCeldas this gt 0CF gt GetFilterO0fPiezasArray organo PA Id gt GetOutput gt GetNumberOfCells std cout lt lt generando scalars para numceldas lt lt numCeldas lt lt std endl scalars vtkUnsignedCharArray New scalars gt SetNumberOfComponents 4 scalars gt SetNumberOfTuples numCeldas float r 0 float g 0 float b 0 for int i 0 i lt numCeldas itt scalars gt SetTuple4 1 255 255 255 255 this gt OCF gt GetFilterOfPiezasArray organo PA Id gt GetOutput gt GetCellData gt SetScalars scalars this gt OCF gt GetFilterOfPiezasArray organo PA Id gt GetOutput gt GetCellData gt Modified PINTA int obj pair num this gt OCF gt GetCollisionedPairOfObjectsNum this gt ActorsVCIdArray 1 int num tri para saber si se ha de colorear trilID o tri2ID int obj _id this gt OCF gt report obj1lID obj pair num bool tril false if obj _id organo_PA Id tril true lse tr
93. t std endl recura 1 return 0 Por ultimo destacar que V Collide no entiende de distancias simplemente detecta si hay o no colisi n En el caso de colision para saber qu tri ngulos han colisionado es muy importante el buen conocimiento de la clase VCReport de VCollide La clase VCReport consta de los siguientes m todos int numObjPairs N mero de pares de objetos en contacto int obj11D int obj pair num ID del primer objeto especificado en el par de objetos int obj2ID int obj pair num ID del segundo objeto especificado en el par de objetos int numTriPairs int obj pair num Devuelv 1 n mero de pares d tri ngulos que est n en contacto entre los pares de objetos especificados til s lo cuando se llama a Vcollide Collide con VC_ALL CONTACTS int trilID int obj pair num int ID del primer tri ngulo en el par tri pair num de tri ngulos especificado Tri pair num va desde 0 hasta el n mero de pares de tri ngulos 1 int tri2ID int obj pair num int ID del segundo tri ngulo en el par tri pair num de tri ngulos especificado Tri pair num va desde 0 hasta el n mero de pares de tri ngulos 1 A modo de ejemplo el siguiente c digo se utiliza por la herramienta Cutter para obtener qu tri ngulos tiene que colorear void Cutter cliclzg this gt OCF gt InformAboutCollisions obtiene el id de
94. tores y afiadirlos al sistema de colisiones for int i 0 i lt componentsNumber i objectName objectsNameArray i piezaOBJ this gt ReadOBJFile file i this gt OCF gt AddObject amp this gt ActorsVCIdArray i pieza0BJ scaleX scaleY scaleZ objectName this gt ActorsArray i amp this gt ActorsPAIdArray i auxMapper i gt SetInputConnection this gt OCF gt GetFilterOfPiezasArray this gt ActorsPAIdArray i gt GetOutputPort this gt ActorsArray i gt SetMapper auxMapper i piezaOBJ gt Delete Si es un actor invisible cambiamos el color ActorVisibilityArrayli 0 1E gt GetProperty gt SetColor 0 0 1 0 1 0 gt Ge gt Ge gt DeactivateCol gt DeactivateCol this gt OCF gt Deact gt Deact medimos medimos la longitud del tubo longTubo ActorsArray 0 gt GetYRange 0 ActorsArray 0 tYRange 1 for int i 0 la longitud de la esfe longEsfera ActorsArray 1 gt GetYRange 0 ActorsArray 1 tYRange 1 i lt componentsNumber ra p ET ActorsArrayli centro ActorsArray i gt GetCenter ActorsArray i gt SetOrigin centro 0 0 centro 2 ActorsArray i gt RotateWxXYZ 90 1 0 0 cambiamos el color de la esfera Ac torsArray desplazamos la esfera 1 gt GetProperty gt SetColor 0 1 0 9 0 9 ActorsArray 1 gt AddPosition 0 0 longTub
95. tory respectivamente Estas variables no hay que inicializarlas ya que es dentro del propio m todo AddObject desde donde se les asignara valor El m todo AddObject se encarga de procesar el objeto triangularizar y escalar antes de a adir al sistema de colisiones y de guardar el filtro con el procesamiento realizado void AddObject int id vtkAlgorithm algorithm double scaleX double scaleY double scaleZ char nombre vtkActor actor int PA indice Para recuperar el filtro utilizaremos el m todo GetFilterOfPiezasArray vtkTransformPolyDataFilter GetFilterOfPiezasArray int PA index return this gt PiezasArray PA index filtro El m todo AddObject void CollisionObjectFactory AddObject int id vtkAlgorithm algorithm double scaleX double scaleY double scaleZ char nombre vtkActor actor int PA indice Para afiadir un objeto al sistema de colisiones VCollide hay que tener en cuenta dos consideraciones 1 Triangularizar 2 No soporta escalado por lo que el escalado debe hacerse Ly a priori utilizando vtkTransformPolyDataFilter std cout lt lt A adiendo objeto al sistema de colisiones n Triangularizamos vtkTriangleFilter triObject vtkTriangleFilter New triObject gt SetInputConnection algorithm gt GetOutputPort triO0bject gt SetPassLines 5 Escalamos vtkTransform tr vtkTransform New tr gt Scale scaleX scaleY scaleZ vtkTrans
96. tran en un componente V Collide llamado RAPID el cual tambi n es una librer a de detecci n de colisiones independiente Las diferencias entre ambas librer as son las siguientes 1 V Collide conserva informaci n acerca de donde se encuentran los objetos en el ambiente de tal manera que si stos no se mueven sus localizaciones no tienen que ser recalculadas como en RAPID 2 V Collide permite la verificaci n de muchos objetos de forma simult nea y RAPID solamente permite la verificaci n de dos 3 RAPID reporta qu parejas de tri ngulos exactamente colisionaron mientras que V Collide solo reporta colisi n entre los objetos Algoritmo de construcci n del arbol de OBB s La construcci n del arbol se realiza en dos pasos primero una colocaci n de OBB s estrechamente ajustados alrededor de una colecci n de pol gonos y segundo la agrupaci n de OBB s anidados en una jerarqu a en forma de rbol En primer lugar se quiere aproximar la colecci n de pol gonos con un OBB de similares dimensiones y orientaci n Se triangularizan los pol gonos compuestos de m s de tres lados El algoritmo de c lculo de OBB hace uso de estad sticas de primer y segundo orden resumiendo las coordenadas de los v rtices Se trata de la media u y la matriz de covarianza C respectivamente Si los v rtices del tri ngulo i simo son los puntos pi qi y ri entonces la media y la matriz de covarianza pueden ser expresadas en notaci n
97. tril false if obj _id organo_PA Id tril true lse tril false for int k 0 k lt this gt OCF gt report numTriPairs ob _pair_num k if tril true num_tri this gt OCF gt report trilID obj pair _num k else num_tri this gt OCF gt report tri2ID obj pair _num k pinta de color rojo scalars gt SetTuple4 num_tri 220 17 17 255 this gt OCF gt GetFilterOfPiezasArray organo PA Id gt GetOutput gt GetCellData gt Modified else std cout lt lt No puede pintar n Cap tulo 5 Creaci n de herramientas 3D con VTK Introducci n En este cap tulo se explica el proceso de creaci n de una herramienta 3D para utilizar desde el simulador de Laparoscopia Los pasos a seguir son Dise o de las piezas que componen la herramienta Almacenado de las piezas en un formato adecuado Desarrollo de la clase en base a alguna de las existentes Para el primer paso se requiere el uso de un software de dise o gr fico en 3D que permita la exportaci n del dise o a un formato gr fico soportado por VTK Para el caso que nos ocupa utilizaremos el software 3DS Max que permite guardar los objetos 3D dise ados en formato wavefront archivos con extensi n obj formato f cil de importar desde VTK pero se podr a haber utilizado cualquier otro software Dise o de herramientas con 3DS Max Como se ha comentado en el punto anterior se podr a haber utilizado cual
98. ulaci n para tener un buen rendimiento en simulaciones de animaciones y movimiento Las jerarqu as de OBBs Oriented Bounding Boxes y los algoritmos exactos de colisi n se toman de RAPID un componente de V Collide que tambi n est disponible como un paquete independiente Integraci n de VTK y Vcollide Para integrar VTK y VCollide en el proyecto de Laparoscopia se ha desarrollado una clase intermediaria entre VTK y VCollide CollisionObjectFactory En la clase CollisionObjectFactory de ahora en adelante COF se ha desarrollado un m todo fundamental para a adir un objeto VTK al sistema VCollide el m todo AddObject Este m todo se encarga de hacer el siguiente procesado con el objeto que se le pasa como par metro triangularizaci n de los pol gonos escalado en los ejes X Y y Z Obtenci n de informaci n de los tri ngulos coordenadas de los v rtices y asociaciones de v rtices y almacenamiento en matrices din micas creaci n de un objeto Vcollide utilizando para ello la informaci n de los tri ngulos almacenada en las matrices din micas La definici n del m todo AddObject A ade objeto al sistema VCollide y almacena el indice del array PiezasArray void AddObject int id vtkAlgorithm algorithm double scaleX double scaleY double scaleZ char nombre vtkActor actor int PA indice Veamos a continuaci n qu son y para que sirven cada uno de los par metros de este m todo AddObject
99. ularly to make sure that the application is performing correctly DATA FILES V Collide has no native data file format so you are free to use to format of your choice Th xample code reads from several different file types CONVERTING FROM 1 COLLIDE The high level structure of V Collide is similar to that of I Collide but the underlying basis is different so shapes need to be described differently V Collide does not specify its own file format the way I Collide did Instead load your objects from whatever storage format is most convenient for you Then specify to V Collide every triangle in the model V Collide also differs from I Collide in its specification of activation state V Collide has two distinct layers of activation state while I Collide has only one As objects are created in V Collide they default to being active objects and all pairwise interactions are also active by default V Collide does not currently support I Collide s object instancing dynamically resized bounding boxes or distance computations Anexo D Bibliograf a http www vtk org e http www trolltech com e http vtkblog blogspot com e The Visualization Toolkit User s Guide Kitware Kitware Inc publishers e The Visualization Toolkit An Object Oriented Approach To 3D Graphics 4th Edition Will Schroeder Ken Martin Bill Lorensen Kitware Inc publishers e A r
100. uloRotadoElevacion obtiene angulo double angulo angulo_actual z calcula el nuevo angulo si el nuevo angulo es menor que el maximo permitido ejecuta el movimiento if angulo lt 90 amp amp angulo gt 90 this gt RotateXYZAssembly z 0 0 Mueve los actores y actualiza sus matrices en VCollide colision this gt AnyActorVisibleHasCollisioned si hay colision de cualquier actor VISIBLE se revierte la operacion if colision 1 this gt RotateXYZAssembly Z 0 0 else this gt SetAnguloRotadoElevacion angulo actualiza angulo std cout lt lt Elevacion lt lt this gt GetAnguloRotadoElevacion lt lt std endl hasta aqui si el angulo es permitido void Herramienta3D ruedaDelante rh H nt r 2 loat phi 180 this gt GetAnguloRotadoAzimuth hi phi vtkMath DegreesToRadians loat theta 90 this gt GetAnguloRotadoElevacion heta theta vtkMath DegreesToRadians loat x r sin theta sin phi loat y r cos theta loat z r sin theta cos phi this gt AddPositionXYZ x y Z SEAS UE lt lt VAL MARLEN EL Ed renal r th Ph ce PO void Herramienta3D ruedaAtras int 1 2 loat phi 180 this gt GetAnguloRotadoAzimuth hi phi vtkMath DegreesToRadians loat theta 90 this gt GetAnguloRotadoElevacion heta theta vtkMath DegreesToRadians loat x r sin theta sin phi loat y r
101. una salida de una o mas isosuperficies Es necesario especificar uno o m s valores de contorno para generar las isosuperficies aunque alternativamente es posible especificar un rango min max escalar y el numero de contornos para generar una serie de valores de contorno equiespaciados vtkMarchingCubes MCubes vtkMarchiingCubes New MCubes gt SetValue int 1 double valor Selecciona un valor de contorno particular en el contorno numero 1 El rango de i debe de situarse entre 0 y el N mero de Contornos y valor define el valor del contorno buscado A su salida tendremos un objeto deltipo PolyData Algoritmo de colisiones utilizado En este proyecto se ha utilizado la librer a de detecci n de colisiones V Collide V Collide es una librer a de detecci n de colisiones desarrollada por el grupo GAMMA Geometric Algorithm for modeling motion and animation por sus siglas en ingl s de la universidad de Carolina del Norte La librer a est dise ada para operar en ambientes que contienen un gran n mero de objetos geom tricos formados por mallas de tri ngulos realizando la detecci n de colisiones entre parejas de objetos a trav s de dos etapas 1 Construir OBB s hierarchical oriented bounding boxes para cada objeto con el fin de encontrar parejas de tri ngulos que posiblemente intersecten los OBB s 2 Verificar si las parejas de tri ngulos detectadas en la etapa 1 realmente se intersectan Estas etapas se encuen
102. y 0 gt RotateWXYZ 90 1 0 0 establece los angulos this gt SetAnguloRotadoElevacion 0 this gt SetAnguloRotadoAzimuth 0 actualiza la matriz en el sistema de colisiones this gt O0CF gt UpdateActorMatrixInVCollide this gt ActorsVCIdArray 0 this gt ActorsArray 0 cout lt lt crea filo de cutter n crea cuchilla invisible en la punta del cuchilla file C vtkdata Data Viewpoint cuchillo trans obj objectName FILO piezaOBJ this gt Read0BJFile file this gt OCF gt AddObject amp this gt ActorsVCIdArray 1 piezaOBJ scaleX scaleY scaleZ objectName this gt ActorsArray 1 amp this gt ActorsPAIdArray 1 piezaOBJ gt Delete vtkPolyDataMapper esferaM vtkPolyDataMapper New esferaM gt SetInputConnection this gt OCF gt GetFilterOfPiezasArray this gt ActorsPAldArray 1 gt GetOutputPort this gt ActorsArray 1 gt SetMapper esferaM this gt ActorsArray 1 gt SetOrigin centro 0 0 centro 2 this gt ActorsArray 1 gt RotateWXYZ 90 1 0 0 this gt ActorsArray 1 gt GetProperty gt SetColor 0 0 1 0 1 0 desactiva colision entre cutter y filo this gt OCF gt DeactivateCollision CUTTER FILO actualiza la matriz en el sistema de colisiones this gt OCF gt UpdateActorMatrixInvCollide this gt ActorsVCIdArray 1 this gt ActorsArray 1 this gt Ensamblado vtkAssembly New this gt Ensambl
103. y B etc esta expresi n puede simplificarse Con que se cumpla un nica expresi n cualquiera de las 15 restantes pruebas es innecesaria En el peor de los casos se requieren aproximadamente 200 operaciones pero normalmente se necesitar n muchas menos Cap tulo 4 Detecci n de colisiones El simulador de laparoscopia realizado implementa un sistema de detecci n de colisiones basado en las librer as V Collide de tal forma que se detecta colisi n entre Organo Herramienta Herramienta Herramienta Realmente el sistema de colisiones trabaja a nivel de actor por lo que por ejemplo se podr a configurar para que determinadas partes de una herramienta no fueran colisionables En la siguiente imagen se puede observar una instant nea del momento en el que se produce colisi n entre una esfera y una herramienta de laparoscopia E Simulador H ptico para entrenamiento de t cnicas de Laparoscopia Archivo Organo Herramienta Der Herramienta Izq La integraci n de un sistema de colisiones en este proyecto de Laparoscopia ha supuesto un importante desaf o dada la escasa pr cticamente nula informaci n encontrada en Internet sobre VTK y detecci n de colisiones Actor hace referencia al concepto de actor en VTK Introducci n a las librer as V Collide V Collide es una librer a de detecci n de colisiones completamente gratuita para uso no comercial desarrollada por el grupo GAMMA Geometric algorithm for modeling

Download Pdf Manuals

image

Related Search

Related Contents

lËFËËËHËË - G  Craftsman 4-Drawer Service Parts  Audiometers / Spirometers  HOJA TÉCNICA Sarnacol T-660  ORGANIC BROWN  User Manual for Screw Compressors  Medisana FTF  Manual de instruções ENTERTECH D 500 DIGITAL  Instrucciones de servicio  

Copyright © All rights reserved.
Failed to retrieve file